Правило одного определения

Материал из Википедии — свободной энциклопедии
Это старая версия этой страницы, сохранённая РобоСтася (обсуждение | вклад) в 20:15, 2 июня 2008 (+ {{изолированная статья}} с помощью AWB). Она может серьёзно отличаться от текущей версии.
Перейти к навигации Перейти к поиску

Правило одного определения (One Definition Rule) (ODR) одно из основных принципов языка программирования C++.

Вкратце, положения ODR выглядят так:

  1. Любая единица трансляции, шаблон, тип данных, функция, или объект не могут иметь более одного определения. Некоторые могут иметь неограниченное число объявлений. Определение порождает сущность.
  2. Во всей программе объект или невложенная функция не могут иметь больше одного определения; если объект или функция используются, у каждого из них должно быть строго по единственному опрделению. Можно объявить объект или функцию, которые не будут использованы, но в этом случае вы не должны создавать определение. Ни в коем случае не должно быть более одного определения.
  3. Некоторые вещи, например, типы, шаблоны или вложенные функции, могут определяться в более чемодной единице трансляции. Для данной сущности, каждое опредление должнобыть одним и тем же. Объекты или функции, не являющиеся внешними, в разных единицах трансляции имеют разные сущности, даже если их имена и типы совпадают.

Некоторые нарушения 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 описано дважды, но не определено. Эти виды ошибок (ошибки компоновки) не могут быть обнаружены компилятором, который за один раз видит только один файл. Компоновщик, однако, их обнаруживает.

Дополнительная информация