对我来说,这些术语在使用C编程语言时基本上是同义词。在实践中,我可能更喜欢文件内原型的“前向声明”而不是通过头文件包含的原型的“函数原型”。但是当你考虑预处理后发生的事情时,即使这是一个人为的区别。也许我错过了什么。
对于何时使用一个术语而不是另一个术语是否存在共识?
答案 0 :(得分:7)
IMO那些不是真正的同义词。 对我来说,“函数原型”是指函数名称及其参数'和返回的类型。它不仅适用于您所谓的“前向声明”。所有功能都有原型。
我们经常在功能声明与其对应的定义之间产生差异。
答案 1 :(得分: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
答案 2 :(得分:4)
我使用术语前向声明来表示以下类型的struct
声明及其定义。
struct Foo;
函数声明不一定是完整的原型,与1989年之前(K& R)C兼容。
char *foo(); // NOT the same as char *foo(void)
答案 3 :(得分:0)
我所知道的唯一概念是声明和定义之间的区别。原型是一个声明,可以随时随地发生,定义是给定对象的实际实现。根据这个概念,没有任何东西叫做前瞻声明,只是宣言的命令。
答案 4 :(得分:-1)
我不知道是否达成共识,但我认为最简洁的方法是:
我不喜欢在文件中放置声明,因为你可以在C中有没有错误的冲突声明,这可能导致段错误,例如:如果a.c有
int foo(char *str_one, char *str_two, char *str_three);
和b.c已经
int foo(char *str_one, char *str_two);
你不会收到警告和错误,并且从bc调用foo()不会将所有参数放在堆栈所在的位置,这意味着foo()只会从堆栈中获取某些内容并将其视为str_three ,可能导致段错误。所以对我来说,声明转到头文件,定义转到源文件。