【问题标题】:Can This Code Compile? [duplicate]这段代码可以编译吗? [复制]
【发布时间】:2023-03-31 12:58:01
【问题描述】:

可能的重复:
C++ void return type of main()
What is the proper declaration of main?

简单的问题,真的。

我和我的朋友正在阅读我们应该在下学期听到的教授的 Powerpoint 幻灯片。这将是一门Java课程。由于某种原因,他有这个 C++ 代码 sn-p

#include <iostream.h>
main ()
{ cout << "Hello, World\n"; }

我告诉我的朋友,“不,这不适用于任何现代 C++ 编译器。”

我现在的问题是,这可以编译吗?

【问题讨论】:

标签: c++


【解决方案1】:

这还值得质疑吗?为什么要编写极端案例 C/C++?遵守标准有什么问题? main() 是程序的入口点,操作系统需要程序的返回码。现在有人争论void main() 是否可以接受,但为什么还要为它辩护呢?只需使用 int main() 并成为一个编写好代码的快乐小伙子:

#include <iostream>

int main(int argc, char* argv[]) {
    std::cout << "Hello World!\n";
    return 0;
}

我用这个启动每个程序(没有硬件!然后),从来没有任何问题。

【讨论】:

    【解决方案2】:

    这不是标准的 C++。对于这么短的一段代码,问题列表相当长……可能是因为它来自很久以前和一个旧的不合格编译器。

    • 包含头的正确名称是 #include &lt;iostream&gt;.h 在 ANSI 标准化期间被删除。

    • 类型必须在 C++ 中明确说明。您不能声明没有返回类型的函数并获得默认的int(即 C,而不是 C++)。

    • main 的标准签名是:int main()int main( int argc, char** )(实现可以提供额外的参数,但返回类型必须是 int

    • cout 定义在std 命名空间内,除非添加using,否则不能在没有限定的情况下使用。

    适当的 C++ 中的等效代码是

    #include <iostream>
    int main() {
       std::cout << "Hello world\n";
    }
    

    【讨论】:

      【解决方案3】:

      这将编译,尽管任何体面的编译器都应该发出警告。由于您使用的是#include &lt;iostream.h&gt;,编译器假定这是旧代码并以向后兼容的模式编译它。在我的机器上,gcc 说:

      In file included from /usr/include/c++/4.2.1/backward/iostream.h:31,
                       from oldcpp.cpp:1:
      /usr/include/c++/4.2.1/backward/backward_warning.h:32:2: warning:
      #warning This file includes at least one deprecated or antiquated header. 
      Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ 
      standard. Examples include substituting the <X> header for the <X.h> header for C++ 
      includes, or <iostream> instead of the deprecated header <iostream.h>. 
      To disable this warning use -Wno-deprecated.
      

      但它仍然可以很好地编译它。在运行代码时,我得到了预期的结果:即:

      Hello, World
      

      【讨论】:

      • 不应在任何符合标准的编译器中编译。 C++ 不允许隐式返回类型,并且 main 的签名返回 int。许多编译器仍然允许过时的 .h 头文件,但缺少的返回类型应该是一个显示停止器。话又说回来,g++ 似乎默认接受它,但会用 -Wall 或 -pedantic 发出警告
      • 这有一个很好的理由。尽管根据标准 C++ 这不正确,但这将是有效的代码预标准化。为了防止真正的旧代码被破坏,大多数编译器仍应在编译时发出警告,除非明确不这样做。
      • @dribeas:允许符合标准的编译器编译非标准代码,前提是它们发出诊断信息。所以说它“不应该编译”是不正确的。它不应该干净地编译
      【解决方案4】:

      当然可以。

      例如,假设&lt;iostream.h&gt; 是具有以下内容的标头:

      #include <iostream>
      using std::cout;
      #define main int main
      

      【讨论】:

      • 绝对允许#define main 到别的地方吗?
      • @Mark:当然。它只是一个标识符;除非它被用作全局命名空间中的函数名,否则它作为标识符并没有什么特别之处。
      • 或者“iostream.h”的最后一行当然可以是int ;-)
      • @Steve:哦,这是一个更好的主意!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-16
      • 1970-01-01
      • 2023-04-10
      相关资源
      最近更新 更多