2014-12-20 2 views
-1

Если мы не упомянем прототип функции, вызовите функцию из основного и запишите определение после main, оно даст ошибку. Если мы напишем определение функции до main и не будем писать прототип, то программа работает хорошо. Поэтому мой вопрос заключается в том, если мы напишем определение функции до main (без написания прототипа), решает ли она проблему отказа от прототипа функции (т. Е. Компилятор начнет читать сверху вниз и все равно сможет узнать о имя функции, тип возврата, параметры и т. д.)Прототип функции/определение

+0

Определение функции включает объявление функции, если оно не было объявлено ранее. –

+2

Кроме того, что происходит, если вы вызываете функцию, если она не была объявлена ​​ранее, отличается от C и C++. C и C++ имеют некоторое сходство, но они действительно очень разные языки с очень разными семантическими правилами. Поэтому, если вы хотите получить окончательный ответ в будущем, выберите один язык. –

+0

Я думаю, что C и C++ в этом отношении очень разные. Вы должны указать, какой из них вы используете, или какую совместимость вы планируете. –

ответ

0

Определение функции без предшествующего прототипа семантически эквивалентно объявлению прототипа непосредственно перед определением функции. Так что да, это безопасно: определение функции без прототипа, перед любым использованием функции, будет работать нормально.

0

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

0

Да (для C++), компилятор примет это. Для вызова функции компилятор должен увидеть свой прототип или определение раньше. Кроме того, файлы единиц перевода (cpp) составлены сверху вниз, поэтому:

void foo(); 
void foo2() { 
} 

int main() { 
    foo(); 
    foo2(); 
} 

void foo() { 
} 

оба являются правильными. Если вы предоставите прототип foo() без определения foo ниже main(), компилятор по-прежнему примет ваш код, но компоновщик будет жаловаться на ошибку.

+0

@ Marcin Jedrzejewski Если мы пишем void foo() в качестве прототипа и вызываем эту функцию в основном и не определяем функцию ниже main, как вы сказали, компилятор дает ошибку неопределенной ссылки на foo()? – Rooney10

+0

@ Rooney10 да, но это на самом деле компоновщик, который выдаст ошибку, компиляция будет в два этапа, сначала все единицы перевода будут скомпилированы, тогда все результирующие объектные файлы будут связаны. Компилятор не знает, где вы, возможно, определили foo(), он может быть определен в некоторой другой единицы перевода (файл .cpp). – marcinj

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