Встроенная функция в пространстве имен генерирует повторяющиеся символы во время ссылки на gcc

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

Я использую следующие параметры 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

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

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