为什么函数声明在C ++中是强制的而不是在C中?

时间:2011-05-03 23:21:31

标签: c++ c declaration

所以我以前的一个考试有这个问题,到现在为止我一直在读你不需要任何语言的声明吗?

哪个是对的?如果没有声明,C ++会出错,还是会运行?

4 个答案:

答案 0 :(得分:20)

在涉及C和C ++的讨论中,“函数声明”是一个相当含糊的术语。在这方面,这些语言有很大不同。

在C ++语言中,只有一种函数声明:声明包含所有参数类型和返回类型。这样的声明是必要的,因为C ++语言支持函数重载。为了选择调用哪个函数,编译器需要知道函数的所有内容,并且需要知道函数的哪些重载版本可用。如果您“忘记”声明某些重载版本,则不会通过重载解析来考虑它。这至少是C ++中必要的函数声明的原因之一。

在C语言中有两种函数声明:非原型声明和原型声明(或简称​​ prototypes )。 C中的原型与C ++声明非常相似 - 它包含所有参数类型。标准C中一直需要原型用于可变参数函数(具有...参数的函数)。对于非可变函数,即使在今天也不需要 prototype 声明。但是从C99开始,所有其他函数都需要至少非原型声明。在较旧的C89 / 90版本的语言函数中,不需要非变量函数的声明。

所以,这基本上应该回答你的问题。在C ++中,函数声明是必需的,因为语言特性严格依赖它们。在现代C函数中,还需要声明才能使代码更安全。在旧版本的C函数声明中,主要不需要声明,因为语言被定义为在没有它们的情况下工作。

答案 1 :(得分:2)

C中的函数声明对于遗留/向后兼容性原因不是强制性的 - 如果它们是强制性的,那么某些旧的/遗留代码会停止编译。

我猜它们在C ++中是强制性的,因为C ++不是C的严格超集,因此可以明智地选择使它们成为强制性的。

您应该始终声明它们 - 请参阅此问题Must declare function prototype in C?

C99功能声明中的FYI 现在是强制性的。

答案 2 :(得分:1)

函数声明在C中是必需的。但是,原型是可选的,除了变量函数和函数的情况,其参数类型将被默认促销更改。

答案 3 :(得分:0)

我无法回答C。

在C ++中,对于函数:

  • void foo();是一份声明。
  • void foo() { .. }是一个定义一个声明。

在致电foo()之前,您需要在范围内至少有一个声明。

数据变量的情况大致相同。