2013-05-20 2 views
3

Я новичок на C++. Я не понимаю, почему это нормально (то есть, почему компилятор допускает это), чтобы одна функция была объявлена ​​дважды. Например, следующий закон является законным:Объявление функций C++

#include <iostream> 
#include <string> 

int hello(); 
int hello(); 

int main(){ 
    cout << "hello, world" << endl; 
} 

int hello(){ 
    return 1; 
} 

Почему компилятор не жалуется?

+1

Это может быть объявлено как много сколько хотите. В противном случае разные заголовки не будут работать так хорошо вместе. – chris

ответ

1

В C и C++ вперед заявления очень слабы. Они предоставляют формальное «обещание» компилятору, что если функция с указанной сигнатурой вообще появляется, у нее будет указанная вами подпись. Функция даже не гарантируется: если вы не вызываете или не ссылаетесь на объявленную функцию, компилятор не собирается жаловаться, что есть объявление без определения. Стандарт требует, чтобы компиляторы обрабатывали идентичные декларации вперед как единую декларацию.

В отличие от определений, которые должны быть уникальными в соответствии с правилом одного определения

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

декларации просто обязаны относиться к одному определению, то есть быть эквивалентны друг другу:

3.3.4 Учитывая набор decla пайки в той же декларативной области, каждая из которых указывает одно и то же неквалифицированное имя, все они относятся к одному и тому же объекту или все относятся к функциям или функциональным шаблонам, [...]

0

Ваше сомнение будет устранено «Правилом одного определения». Он определен в стандарте ISO C++ (ISO/IEC 14882) 2003, раздел 3.2.

В нем говорится, что:

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

Подробнее об этом в Википедии (http://en.wikipedia.org/wiki/One_Definition_Rule)

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