Ошибка компоновщика, если в заголовочном файле определена не встроенная функция?

Не встроенная функция, определенная в заголовочном файле с защитой

#if !defined(HEADER_RANDOM_H)
#define HEADER_RANDOM_H 
void foo()
{
//something
}
#endif

В результате возникает ошибка компоновщика: уже определено в файле someother.obj. Встроенная функция работает нормально, но я не могу понять, почему в первом случае функция уже выдает ошибку.

3 ответа

Решение

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

Вы нарушаете одно определение правила. Если вы хотите определить функцию непосредственно в заголовке, вы должны пометить ее как inline - это позволит определить функцию несколько раз. Также обратите внимание, что inline не имеет другого значения, в частности, он не заставляет компилятор выполнять встроенные вызовы (вопреки распространенному мнению).

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

Другие вопросы по тегам