c++ - C++ 需要函数原型(prototype)吗?

标签 c++ prototype

基本上,我正在通读 this就在这里和 第 1.6 节:C 和 C++ 之间的一些差异 中说明:

Another subtle difference between C and C++ is that in a C++ program, all functions must be prototyped.

我确信我编写的所有 C++ 程序都不是这样。这仅适用于某些版本的 C++ 吗? C 也是如此吗?

最佳答案

C++ 从一开始就是如此(尽管在 C++ 中它只是称为“声明”,而不是“原型(prototype)”)。

C 在几十年前就已存在,它允许您在不声明函数的情况下调用它。但是,如果您愿意,您可以声明一个函数——通常是告诉编译器它的返回类型不同于编译器自己推导出的返回类型。所以,在 C 中,函数声明看起来像这样:

long f();

请注意那里的空括号。这就是函数“声明”与函数“原型(prototype)”的区别(尽管原型(prototype)基本上是声明的超集,因此原型(prototype)也声明了相关函数)。原型(prototype)总是在括号内有一些东西来指示函数接受的参数的数量和类型,按照这个一般顺序:

short g(int a, double b);

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

int h(void);

如果您将括号留空,(如上所述)意味着它是一个函数声明而不是原型(prototype)——这意味着您告诉编译器函数的返回类型,但您不是 告诉它参数的数量或类型。

C++(在它被称为 C++ 之前,如果我没记错的话)只有一个概念,而不是 C 中的两个。在 C++ 中,每个函数都必须声明——声明总是包括参数的数量,以及每个的类型。这对于支持(举一个明显的例子)函数重载是绝对必要的,其中要调用的正确函数取决于您在调用中传递的参数的数量和类型。

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

在相当现代的 C 语言中,您通常会得到几乎相同的结果——也就是说,“新的”(即非古老的)类型函数定义也充当该函数的原型(prototype)。正如 C 最初定义的那样,它包含一个函数定义的语法,如下所示:

int f(a, b, c) 
int a;
short b;
long c;
{
    // function body here
}

这定义了函数,但编译器仅将其视为函数声明,而不是原型(prototype)——也就是说,它告诉编译器返回类型,但参数的数量和类型(即使它们已指定)编译器使用函数原型(prototype)的方式不同。不过,C++ 从未使用或支持过这种函数定义风格。

关于c++ - C++ 需要函数原型(prototype)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43379880/

相关文章:

Javascript 不调用原型(prototype)方法

Javascript 的 "Object.getOwnPropertyNames"缺少属性?

c++ - 如何避免 GDI+ 中的虚线破损?

c++ - 如何将 vector 转换为数组

c++ - 我必须学习哪种 C++ 才能制作自己的操作系统内核?

javascript - 对 JavaScript 原生类型进行原型(prototype)设计,气馁了?

c++ - 在渲染 SDL_TTF 文本 C++ 时显示变量

c++ - 避免对象切片和使用 shared_ptr

javascript - 有没有一种方法可以利用在JavaScript工厂函数中使用原型(prototype)方法的性能优势?

javascript concat 使用 call 方法