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