【问题标题】:Why are function declaration mandatory in C++ and not in C?为什么函数声明在 C++ 中是强制性的,而不是在 C 中?
【发布时间】:2011-05-03 23:21:30
【问题描述】:

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

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

【问题讨论】:

  • 问题是,既然他已经知道了的答案,为什么还要需要答案?
  • @Alexander Ahh..自相矛盾。 Jon Skeet 可能会回答这个问题。
  • @Alexander:可以肯定。之前出现了太多相互矛盾的答案。
  • @Achint - 原谅我,我是在嘲笑 42 在回答问题时具有非常特殊的含义。我不是说这个问题不好。

标签: c++ c declaration


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    C99 函数声明中的仅供参考现在是强制性的。

    【讨论】:

      【解决方案3】:

      函数声明在 C 中是强制性的。然而,原型是可选的,除了可变参数函数和其参数类型将被默认提升更改的函数。

      【讨论】:

        【解决方案4】:

        我无法回答 C。

        在 C++ 中,对于函数:

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

        在调用foo() 之前,您至少需要一个范围内的声明。

        数据变量也是如此。

        【讨论】:

        • 这并不能真正回答问题。
        • 它如何不回答“如果没有声明,C++ 会给出错误,还是会运行?”的问题?
        • 因为它说:“为什么函数声明在 C++ 中是强制性的”。我没有说为什么(顺便说一句,我没有对你投反对票)。
        • @Tomalak:为什么要这样设计?你的回答没有回答问题。
        • @Tomalak:实际上我有一个编译器和编程语言课程,每种语言的设计背后都有明显的逻辑和推理。我的问题的重点是,C++ 和 C 之间有什么区别因素使得 C++ 必须有声明,而 C 不一定有。我认为答案不会是主观的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-04
        • 2014-03-01
        • 1970-01-01
        相关资源
        最近更新 更多