这段代码可以编译吗? [复制]

Posted

技术标签:

【中文标题】这段代码可以编译吗? [复制]【英文标题】:Can This Code Compile? [duplicate] 【发布时间】:2011-07-18 12:34:58 【问题描述】:

可能的重复: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++ 编译器。”

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

【问题讨论】:

你试过了吗? 更好的副本是What is the proper declaration of main()?,但我想它仍然不是完全副本。 【参考方案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:哦,这是一个更好的主意!

以上是关于这段代码可以编译吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

调用复制 ctor 而不是移动 ctor - 编译器可以发出警告吗?

为啥这段代码试图调用复制构造函数?

swift编译器显示预期的声明错误? [复制]

为啥这段代码会进入无限循环? [复制]

我可以使用密钥库反编译项目吗? [复制]

编译 dll 项目时生成的 .lib 文件有啥用处,我可以将它用于静态链接吗? [复制]