2011-12-13 3 views
12

Для меня эти термины по существу являются синонимами при использовании языка программирования C. На практике я мог бы предпочесть «форвардную декларацию» для прототипов внутри файла в сравнении с «прототипом функции» для прототипов, включенных через файл заголовка. Но даже это искусственное различие, когда вы рассматриваете, что происходит после предварительной обработки. Возможно, я что-то упустил.Терминология: форвардная декларация против функции Прототип

Существует ли консенсус относительно того, когда использовать один термин в сравнении с другим?

ответ

6

ИМО это не синонимы. Для меня «прототип функции» относится к имени функции и ее параметрам и типам возврата. Это относится не только к тому, что вы называете «форвардной декларацией». Все функции имеют прототип.

Мы чаще делаем различие между функцией декларацией и его соответствующим определения.

+1

+1, хотя это очень часто используют слово «прототип», чтобы обратиться к объявлению , –

+0

Я думаю, вы и @MatteoItalia подвели итоги. Я использовал термин «прототип», когда я должен использовать декларацию термина. –

4

Я использую термин форвардная декларация для следующего вида объявления struct с определением.

struct Foo; 

Объявление функции не обязательно должен быть полный прототип, для совместимости с предварительной 1989 (K & R) C.

char *foo(); // NOT the same as char *foo(void) 
0

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

-1

Я не знаю, если есть консенсус, но я думаю, что самый чистый способ сделать это было бы:

  • Поместите все объявления в заголовочных файлах, никогда в источнике или .c файлов. (Я думаю, что вы имеете в виду заявления, когда вы говорите, опережающее объявление.)
  • Помести все определения в исходных файлах

Я не хотело размещать объявления в файлах, потому что вы можете иметь противоречивые заявления без ошибок в С, может вызвать ошибки сегментации, например: если ас имеет

int foo(char *str_one, char *str_two, char *str_three); 

и Ьс имеет

int foo(char *str_one, char *str_two); 

вы не получите предупреждения, ни ошибки, и вызовы, сделанные foo() из b.c, не будут размещать все параметры в стеке, где они должны быть, то есть foo() просто возьмет что-то из стека и обработает его как str_three, что может привести к segfault. Поэтому для меня объявления идут в файлы заголовков, а определения идут в исходные файлы.

+2

Объявления для 'статических' функций должны быть помещены в файл C, который они определены в imho, желательно в начале. –

+0

@ tristopia - хороший момент, я не думал о статических функциях, когда я попал на мой ящик. Я определенно не объявлял бы их в файле заголовка. – dbeer

6

Термин «прототип» относится к конкретному синтаксису объявления; в частности, что количество и типы параметров функции появляются в декларации.Учитывая определение функции из

int foo(int a, char *b) {...} 

вы можете иметь любой из следующих деклараций:

int foo();    // a declaration, but not a prototype 
int foo(a, b);   // a declaration, but not a prototype 
int foo(int, char *);  // a declaration and a prototype 
int foo(int a, char *b); // a declaration and a prototype 
+0

Ваш параметр 'int foo (a, b);' действителен только в том случае, если 'a' и' b' являются известными именами типов, или если за ним следует точка тела '{...}' вместо точки с запятой. –

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