所以我以前的一个考试有这个问题,到现在为止我一直在读你不需要任何语言的声明吗?
哪个是对的?如果没有声明,C ++会出错,还是会运行?
答案 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()
之前,您需要在范围内至少有一个声明。
数据变量的情况大致相同。