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

StackOverflow https://stackoverflow.com/questions/1073754

Вопрос

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top