Ответ 1
Нестатическое объявление функции inline
относится к одной и той же функции в каждой используемой системе перевода (исходный файл).
В правиле одного определения требуется, чтобы тело определения функции было одинаковым в каждом TU, который содержит его, с длинным определением "идентичный". Обычно это выполняется при условии, что исходные файлы используют один и тот же заголовок и при условии, что функция не использует глобальные имена с внутренней связью (включая функции static
) или любые макросы, которые по-разному определены в разных TU.
Я не помню, чтобы встречал эту конкретную ошибку компоновщика раньше, но, по крайней мере, возможно, что одно из этих ограничений отвечает. Это ваша обязанность удовлетворять требованиям: undefined поведение без необходимости диагностики, если вы этого не сделаете.
Объявление функции static inline
относится к другой функции в каждой единицы перевода, которая имеет одно и то же имя. Он может использовать глобальные имена или макросы static
, которые различны в разных TU, и в этом случае функция может вести себя по-разному в разных TU, даже если ее определение в заголовочном файле "выглядит одинаково".
Из-за этой разницы, если функция содержит любые локальные переменные static
, то она ведет себя по-разному в зависимости от того, является ли она static
или нет. Если это static
, то каждый TU имеет свою собственную версию функции и, следовательно, свою собственную копию локальных переменных static
. Если это только inline
, то есть только одна копия локальных переменных static
, используемых всеми TU.