Подтвердить что ты не робот

Разница между встроенной функцией и статической встроенной функцией

Может ли кто-нибудь сказать мне, в чем разница между встроенной функцией и статической встроенной функцией.

В каких случаях я предпочитаю статическую встроенную по сравнению с встроенным?

Я задаю этот вопрос, потому что у меня есть встроенная функция, для которой я сталкиваюсь с проблемами компиляции во время связывания (relocation error:... symbol has been discarded with discarded section ...). Я сделал ее нормальной функцией, и она сработала. Теперь некоторые из моих пожилых людей сказали мне попробовать со статичным встроенным. Ниже приведена моя функция:

inline void wizSendNotifier (const char* nn_name, bpDU* arg=0, int aspect = -1)
{
   wizuiNotifier* notifier = ::wizNtrKit.getNotifier (nn_name);
   notifier->notify (arg, aspect);
}

и это не внутри класса. Это внутри файла заголовка!

Я думаю, что вызов статической функции должен выполняться только в конкретном TU, где он определен.

так как моя функция находится в файле заголовка, и если я сделаю ее статической, будет ли это так, что когда бы я ни включал этот файл заголовка, статическая функция могла использоваться в этой единицы перевода?

4b9b3361

Ответ 1

Нестатическое объявление функции inline относится к одной и той же функции в каждой используемой системе перевода (исходный файл).

В правиле одного определения требуется, чтобы тело определения функции было одинаковым в каждом TU, который содержит его, с длинным определением "идентичный". Обычно это выполняется при условии, что исходные файлы используют один и тот же заголовок и при условии, что функция не использует глобальные имена с внутренней связью (включая функции static) или любые макросы, которые по-разному определены в разных TU.

Я не помню, чтобы встречал эту конкретную ошибку компоновщика раньше, но, по крайней мере, возможно, что одно из этих ограничений отвечает. Это ваша обязанность удовлетворять требованиям: undefined поведение без необходимости диагностики, если вы этого не сделаете.

Объявление функции static inline относится к другой функции в каждой единицы перевода, которая имеет одно и то же имя. Он может использовать глобальные имена или макросы static, которые различны в разных TU, и в этом случае функция может вести себя по-разному в разных TU, даже если ее определение в заголовочном файле "выглядит одинаково".

Из-за этой разницы, если функция содержит любые локальные переменные static, то она ведет себя по-разному в зависимости от того, является ли она static или нет. Если это static, то каждый TU имеет свою собственную версию функции и, следовательно, свою собственную копию локальных переменных static. Если это только inline, то есть только одна копия локальных переменных static, используемых всеми TU.