C++需要函数原型吗?

Sha*_*ala 1 c++ prototype

基本上,我正在阅读本书,并在Section 1.6: Some Differences between C and C++其中说明:

C和C++之间的另一个细微差别是,在C++程序中,所有函数都必须是原型.

我确信C++我写的所有程序都不是这样.这只适用于某些版本C++吗?这也是真的C吗?

Jer*_*fin 9

从一开始就适用于C++(尽管在C++中它只是称为"声明",而不是"原型").

正如C几十年前存在的那样,它允许你在没有声明的情况下调用函数.但是,您可以根据需要声明一个函数 - 通常告诉编译器它的返回类型与编译器自己推断的类型不同.所以,在C中,函数声明看起来像这样:

long f();
Run Code Online (Sandbox Code Playgroud)

注意那里空的parens.这就是将函数"声明"与函数"原型"分开的原因(尽管原型基本上是声明的超集,因此原型也会声明有问题的函数).原型总是在parens中有一些东西来指示函数接受的参数的数量和类型,在这个一般的顺序上:

short g(int a, double b);
Run Code Online (Sandbox Code Playgroud)

如果它不接受任何参数,你必须输入void以表明:

int h(void);
Run Code Online (Sandbox Code Playgroud)

如果你把parens留空,那么(如上所述)意味着它是一个函数声明而不是原型 - 这意味着你告诉编译器函数的返回类型,但你没有告诉它任何关于数字或参数类型.

C++(因为之前它被称为C++,如果我没记错的话)只有一个概念而不是C中的两个.在C++中,每个函数都必须声明 - 并且声明总是包含参数的数量,以及每个函数的类型.这对于支持(对于一个明显的示例)函数重载是绝对必要的,其中正确的调用函数是根据您在调用中传递的参数的数量和类型来确定的.

C++中的函数定义也充当函数声明.必须声明每个函数,但声明不必与定义分开.

在相当现代的C中,您通常会得到几乎相同的 - 也就是说,"新"(即非古老)类型的函数定义也可以作为该函数的原型.由于C最初定义,它包含一个函数定义的语法,如下所示:

int f(a, b, c) 
int a;
short b;
long c;
{
    // function body here
}
Run Code Online (Sandbox Code Playgroud)

这定义了函数,但编译器只将它视为函数声明,而不是原型 - 也就是说,它告诉编译器返回类型,但不使用参数的数量和类型(即使它们被指定)由编译器以与函数原型相同的方式.但是,C++从未使用过或支持过这种函数定义.

  • @ franji1:对不起,但是如果你的编译器允许的话,那就彻底打破了.然而,我的猜测是,你只是错了(可能错过了函数定义也充当函数声明的事实). (5认同)
  • @Olaf:有什么关于:"**几十年前存在的****,它允许你在没有声明的情况下调用一个函数"这不清楚吗? (2认同)