Кто-нибудь может сказать мне, в чем разница между встроенной функцией и статической встроенной функцией?
В каких случаях я предпочитаю статический inline, а не inline?
Я задаю этот вопрос, потому что у меня есть встроенная функция, для которой я сталкиваюсь с проблемами компиляции во время линковки (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, где это определено.
Поскольку моя функция находится в заголовочном файле, и если я сделаю ее статичной, будет ли так, что когда бы я ни включал этот заголовочный файл, статическая функция может использоваться в этом модуле перевода?
Нестатический inline
Объявление функции относится к той же функции в каждой единице перевода (исходном файле), которая ее использует.
Правило «Одно определение» требует, чтобы тело определения функции было идентичным в каждом TU, в котором оно содержится, с длинным определением «идентичный». Обычно это выполняется при условии, что все исходные файлы используют один и тот же заголовок, и при условии, что функция не использует глобальные имена с внутренней связью (включая static
функции) или любые макросы, которые по-разному определены в разных TU.
Я не помню, чтобы когда-либо сталкивался с этой конкретной ошибкой компоновщика, но, по крайней мере, возможно, что за это отвечает одно из этих ограничений. Вы несете ответственность за выполнение требований: неопределенное поведение без диагностики не требуется.
static inline
Объявление функции относится к разным функциям в каждой единице перевода, которые просто имеют одно и то же имя. Можно использовать static
глобальные имена или макросы, которые отличаются в разных TU, в этом случае функция может вести себя по-разному в разных TU, даже если ее определение в заголовочном файле «выглядит одинаково».
Из-за этой разницы, если функция содержит какие-либо static
локальные переменные, то он ведет себя по-разному в зависимости от того, static
или нет. Если это static
тогда каждый TU имеет свою собственную версию функции и, следовательно, свою собственную копию static
локальные переменные. Если это inline
только тогда есть только одна копия static
локальные переменные, используемые всеми TU.
Других решений пока нет …