Описание тега one-definition-rule

Все, что связано с C++ One Definition Rule (ODR), то есть правилом стандарта C++, запрещающим множественные определения большинства языковых объектов. ODR примерно требует, чтобы большинство языковых сущностей (объекты, функции, шаблоны и т. Д.) Имели уникальное (не дублированное) определение в одной и той же единице перевода или во всей программе, в то время как несколько объявлений все еще возможны.

Правило одного определения (ODR) - это концепция, согласно которой в программе допускается не более одного определенного экземпляра функции или объекта.

В C правило одного определения описано в пункте 3 раздела 6.9 раздела C11:

Для каждого идентификатора, объявленного с внутренней связью в единице перевода, должно быть не более одного внешнего определения. Более того, если идентификатор, объявленный с внутренней связью, используется в выражении (кроме как часть операндаsizeof или _Alignof оператор, результатом которого является целочисленная константа), должно быть ровно одно внешнее определение идентификатора в единице перевода.

В C++ правило одного определения объясняется в разделе 3.2 [basic.def.odr] C++11, но кратко резюмируется в первом абзаце:

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

Встроенные функции имеют свои собственные исключения. Расширения языка C ослабляют строгость правила одного определения, разрешая несколько определений, если все их объявления совместимы.