Описание тега one-definition-rule
Правило одного определения (ODR) - это концепция, согласно которой в программе допускается не более одного определенного экземпляра функции или объекта.
В C правило одного определения описано в пункте 3 раздела 6.9 раздела C11:
Для каждого идентификатора, объявленного с внутренней связью в единице перевода, должно быть не более одного внешнего определения. Более того, если идентификатор, объявленный с внутренней связью, используется в выражении (кроме как часть операнда
sizeof
или_Alignof
оператор, результатом которого является целочисленная константа), должно быть ровно одно внешнее определение идентификатора в единице перевода.
В C++ правило одного определения объясняется в разделе 3.2 [basic.def.odr] C++11, но кратко резюмируется в первом абзаце:
Ни одна единица перевода не должна содержать более одного определения любой переменной, функции, типа класса, типа перечисления или шаблона.
Встроенные функции имеют свои собственные исключения. Расширения языка C ослабляют строгость правила одного определения, разрешая несколько определений, если все их объявления совместимы.