术语:前向声明与功能原型

时间:2011-12-13 21:18:03

标签: c terminology forward-declaration function-prototypes

对我来说,这些术语在使用C编程语言时基本上是同义词。在实践中,我可能更喜欢文件内原型的“前向声明”而不是通过头文件包含的原型的“函数原型”。但是当你考虑预处理后发生的事情时,即使这是一个人为的区别。也许我错过了什么。

对于何时使用一个术语而不是另一个术语是否存在共识?

5 个答案:

答案 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文件中。 (我认为你的意思是当你说前言宣言时的声明。)
  • 将所有定义放在源文件中

我不喜欢在文件中放置声明,因为你可以在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 ,可能导致段错误。所以对我来说,声明转到头文件,定义转到源文件。