为什么在C++中函数声明是必须的而在C语言中不是?

16

我之前的一次考试上有这样一个问题,一直以来我一直在阅读资料,但是它们似乎并没有明确说明任何一种语言需要声明。

那么到底应该怎么做呢?如果没有声明,C++ 会报错还是能够运行?


https://dev59.com/fnRB5IYBdhLWcg3wXmNI#645855 - helpermethod
问题是,既然他已经知道答案,为什么他还需要回答呢? - Alexander Gessler
@Alexander 啊..矛盾的。Jon Skeet 可能会回答这个问题。 - zengr
@Alexander:为了确保。之前出现了太多相互矛盾的答案。 - Achint
1
@Achint - 对不起,我只是在调侃42这个数字在回答问题时有着特殊的意义。我并不是说你的问题不好。 - Alexander Gessler
4个回答

21
在涉及 C 和 C++ 的讨论中,“函数声明”是一个相当模糊的术语。这些语言在这方面有很大的不同。
在 C++ 语言中,只有一种类型的函数声明:声明所有参数类型和返回类型的声明。这些声明是必要的,因为 C++ 语言支持函数重载。为了选择调用哪个函数,编译器需要知道关于该函数的一切,并需要知道可用的函数的重载版本。如果您“忘记”声明某些重载版本,则重载决议将不会考虑它。这至少是 C++ 中需要函数声明的原因之一。
在 C 语言中,有两种类型的函数声明:非原型声明和原型声明(或简称为原型)。在 C 中,原型与 C++ 声明非常相似 - 它包括所有参数类型。对于变参函数(带有...参数)来说,标准 C 总是需要原型。对于非变参函数而言,即使是现代 C 中也不需要原型声明。但是从 C99 开始,至少对于所有其他函数,都需要进行非原型声明。在较旧的 C89/90 版本中,非变参函数的函数声明并不是必需的。
因此,这基本上回答了您的问题。在 C++ 中,需要函数声明,因为语言功能严重依赖它们。在现代 C 中也需要函数声明,只是为了使代码更加安全。在较旧的 C 版本中,函数声明并不是必需的,主要是因为该语言被定义为可以在没有它们的情况下工作。

2
在 C 中,函数声明不是强制性的,出于向后兼容的原因 - 如果它们被强制,则某些旧的/遗留代码将停止编译。
我猜它们在 C++ 中是强制性的,因为 C++ 不是 C 的严格超集,所以可以做出明智的选择,使它们成为强制性。
但是,您应该始终声明它们 - 参见此问题 Must declare function prototype in C? 值得注意的是,在 C99 中,函数声明现在是强制性的。

1

在 C 语言中,函数声明是必须的。但是,原型声明是可选的,除了变参函数和参数类型会被默认提升的函数。


-1

我不会回答关于C语言的问题。

C++中,对于函数:

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

在调用 foo() 之前,你需要至少有一个声明在作用域内。

对于数据变量,情况基本相同。


5
这并没有真正回答这个问题。 - helpermethod
1
因为它说:“为什么在C++中函数声明是强制性的。”它没有说为什么(顺便说一下,我没有给你投反对票)。 - helpermethod
2
@Tomalak:为什么要这样设计?你的回答并没有回答问题。 - Puppy
@DeadMG:你指的是问题标题。我回答的是实际的问题内容。此外,“为什么C++标准委员会以这种方式设计事物”是高度主观的,不是Stack Overflow上的好问题。 - Lightness Races in Orbit
2
@Tomalak:实际上,我学过编译器和编程语言课程,每种语言的设计背后都有明显的逻辑和推理。我的问题是,C++和C之间的区别因素是什么,使得C++必须要有声明,而C则不一定需要。我认为答案不会是主观的。 - Achint
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接