基本上,我正在阅读this本书并在Section 1.6: Some Differences between C and C++
中说明:
C和C ++之间的另一个细微差别是在C ++程序中, 所有功能必须是原型。
我确信在我编写的所有C++
程序中都不是这样。这仅适用于C++
的某些版本吗?对C
也是如此吗?
答案 0 :(得分:9)
从一开始就存在C ++(尽管在C ++中它只是被称为“声明”,而不是“原型”)。
正如C几十年前存在的那样,它允许你在没有声明的情况下调用函数。但是,可以,如果你想要声明一个函数 - 通常告诉编译器它的返回类型与编译器自己推断的不同。因此,在C中,函数声明看起来像这样:
long f();
注意那里空的parens。这就是将函数“声明”与函数“原型”分开的原因(尽管原型基本上是声明的超集,因此原型也会声明有问题的函数)。原型总是在parens中有一些东西来表示函数接受的参数的数量和类型,按照这个一般顺序:
short g(int a, double b);
如果它不接受任何参数,您必须输入void
来表示:
int h(void);
如果你把parens留空,那(如上所述)意味着它是一个函数声明而不是原型 - 这意味着你告诉编译器函数的返回类型,但是你不是< / em>告诉它有关参数的数量或类型的任何信息。
C ++(因为之前它被称为C ++,如果我没记错的话)只有一个概念而不是C中的两个概念。在C ++中,必须声明每个函数 - 并且声明总是包含参数的数量,并且每种类型。这对于支持(对于一个明显的示例)函数重载是绝对必要的,其中正确的调用函数是根据您在调用中传递的参数的数量和类型来确定的。
C ++中的函数定义也充当函数声明。必须声明每个函数,但声明不必与定义分开。
在相当现代的C中,你通常会得到几乎相同的东西 - 也就是说,“新”(即非古代)类型的函数定义也可以作为该函数的原型。由于最初定义了C,它包含了一个函数定义的语法,如下所示:
int f(a, b, c)
int a;
short b;
long c;
{
// function body here
}
这定义了函数,但编译器只将其视为函数声明,而不是原型 - 也就是说,它告诉编译器返回类型,但参数的数量和类型(即使它们被指定)编译器不会以与函数原型相同的方式使用它们。 C ++从未使用过或支持过这种函数定义。