Правило одного определения: различия между версиями
[непроверенная версия] | [непроверенная версия] |
Нет описания правки |
Нет описания правки |
||
Строка 27: | Строка 27: | ||
[[Категория:Язык программирования C]] |
[[Категория:Язык программирования C]] |
||
[[en: |
[[en:One_Definition_Rule]] |
Версия от 15:36, 2 июня 2008
Правило одного определения (One Definition Rule) (ODR) одно из основных принципов языка программирования C++.
Вкратце, положения ODR выглядят так:
- Любая единица трансляции, шаблон, тип данных, функция, или объект не могут иметь более одного определения. Некоторые могут иметь неограниченное число объявлений. Определение порождает сущность.
- Во всей программе объект или невложенная функция не могут иметь больше одного определения; если объект или функция используются, у каждого из них должно быть строго по единственному опрделению. Можно объявить объект или функцию, которые не будут использованы, но в этом случае вы не должны создавать определение. Ни в коем случае не должно быть более одного определения.
- Некоторые вещи, например, типы, шаблоны или вложенные функции, могут определяться в более чемодной единице трансляции. Для данной сущности, каждое опредление должнобыть одним и тем же. Объекты или функции, не являющиеся внешними, в разных единицах трансляции имеют разные сущности, даже если их имена и типы совпадают.
Некоторые нарушения ODR могут быть обнаружены компилятором. Остальные, а это в первую очередь касается программ, состоящих из нескольких небольших файлов, пропускаются (программист должен самостоятельно о них позаботиться).
В своей знаменитой книге "Введение в язык C++" Бьорн Страуструп приводит следующий пример: // file1.c:
int a = 1; int b = 1; extern int c;
// file2.c: int a; extern double b; extern int c;
В данном примере 3 ошибки: определено дважды (int a; является определением, которое означает int a=0;), b описано дважды с разными типами, а c описано дважды, но не определено. Эти виды ошибок (ошибки компоновки) не могут быть обнаружены компилятором, который за один раз видит только один файл. Компоновщик, однако, их обнаруживает.