встроенная функция в пространстве имен генерирует повторяющиеся символы во время ссылки на gcc - PullRequest
9 голосов
/ 21 сентября 2010

У меня есть пространство имен со встроенной функцией, которое будет использоваться, если несколько исходных файлов.При попытке связать мое приложение встроенные функции сообщаются как дубликаты символов.Кажется, будто мой код просто не встроил бы функции, и мне было интересно, является ли это ожидаемым поведением и как лучше с ним справиться.

Я использую следующие параметры gcc: -g -Wextra -pedantic -Wmissing-field-initializers -Wredundant-decls -Wfloat-equal -Wno-reorder -Wno-long-long Похоже, что при компиляции в среде VC7 одинаковый стиль кода компилируется и связывается правильно.

В следующем примере кодапоказывает структуру кода:

/* header.h */
namespace myNamespace {
inline bool myFunction() {return true;}
}

/* use_1.cpp */
#include "header.h"
...
bool OK = myNamespace::myFunction();
...

/* use_2.cpp */
#include "header.h"
...
bool OK = myNamespace::myFunction();
...

1 Ответ

0 голосов
/ 21 сентября 2010

Встроенное ключевое слово воспринимается компилятором только как подсказка. Если компилятор решит, что функция будет лучше работать без встроенного, он не будет встроен в нее. Существуют специфичные для поставщика ключевые слова, которые делают встроенный компилятор функцией - это __attribute__((always_inline)) для GCC и __forceinline для Visual C ++.

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

...