2016-12-29 6 views
5

В C++ объявление переменной несколько раз показывает ошибку во время компиляции. Например:Объявление функций и переменных несколько раз в C++

int x; 
int x; 

При объявлении функции несколько раз не отображается ошибка во время компиляции. Например:

int add(int, int); 
int add(int, int); 

Почему это различие в C++?

+0

Функция может быть перегружена, но количество и типы параметров должны быть разными. Переменные не могут быть перегружены. – nischalinn

+0

Не перегружает его простое исправление. декларация может быть сделана в любое время. – user1438832

+0

Это не объявление функции, это объявление прототипа, которое можно выполнить несколько раз. Это различие с C на самом деле. Прототип - это объявление без тела, тело декларации AND считается определением, которое может произойти только один раз. – Swift

ответ

12

Отметьте, что int x; нет (только) declaration, это definition. Таким образом, возникла ошибка, возникшая с момента нарушения ODR, то есть только одно определение разрешено в одной единицы перевода.

Объявление переменной может быть записана в виде:

// a declaration with an extern storage class specifier and without an initializer 
extern int x; 
extern int x; 

В то же время int add(int, int); является декларация (функции) точно. Несколько деклараций в одной единице перевода прекрасны, ODR не нарушается.

+1

Возможно, вы захотите продолжить и объяснить, что объявление 'int add (int int)' не является определением, поэтому ODR не применяется. – Peter

+0

Спасибо за объяснение! Это отвечает моим сомнениям. :) –

+0

Стоит отметить, что прямое объявление функций в заголовках чрезвычайно важно для управления зависимостями (по существу говоря «вы можете предположить, что во время ссылки должна быть функция с этой сигнатурой»). Это форвардное объявление может легко привести к дублированию, если в него включены разные заголовки с тем же объявлением. Тем не менее, дублирующее определение переменных означает 2 разных экземпляра чего-то с тем же именем и не способ их устранить. (Следовательно, это запрещено). –

Смежные вопросы