Ошибка компоновщика, если в заголовочном файле определена не встроенная функция?
Не встроенная функция, определенная в заголовочном файле с защитой
#if !defined(HEADER_RANDOM_H)
#define HEADER_RANDOM_H
void foo()
{
//something
}
#endif
В результате возникает ошибка компоновщика: уже определено в файле someother.obj. Встроенная функция работает нормально, но я не могу понять, почему в первом случае функция уже выдает ошибку.
3 ответа
Если заголовок включен в более чем один исходный файл и функция не помечена как "встроенная", у вас будет более одного определения. Защитники включения предотвращают только несколько включений в одном исходном файле.
Вы нарушаете одно определение правила. Если вы хотите определить функцию непосредственно в заголовке, вы должны пометить ее как inline
- это позволит определить функцию несколько раз. Также обратите внимание, что inline
не имеет другого значения, в частности, он не заставляет компилятор выполнять встроенные вызовы (вопреки распространенному мнению).
Поскольку он не является встроенным, каждая единица перевода будет иметь свою собственную копию функции, в результате чего функция будет определена несколько раз.