我在编译我写的c++程序时遇到了一些困难。

这个程序非常简单,据我所知,它符合c++标准中规定的所有规则。我已经把ISO/IEC 14882:2003通读了两遍。

程序如下:

下面是我在尝试用Visual c++ 2010编译这个程序时收到的输出:

c:\dev>cl /nologo helloworld.png
cl : Command line warning D9024 : unrecognized source file type 'helloworld.png', object file assumed
helloworld.png : fatal error LNK1107: invalid or corrupt file: cannot read at 0x5172

沮丧地,我尝试了g++ 4.5.2,但它同样没有帮助:

c:\dev>g++ helloworld.png
helloworld.png: file not recognized: File format not recognized
collect2: ld returned 1 exit status

我认为Clang(3.0版本trunk 127530)一定可以工作,因为它的标准一致性受到了高度赞扬。不幸的是,它甚至没有给我一个漂亮的,突出显示的错误消息:

c:\dev>clang++ helloworld.png
helloworld.png: file not recognized: File format not recognized
collect2: ld returned 1 exit status
clang++: error: linker (via gcc) command failed with exit code 1 (use -v to see invocation)

老实说,我真的不知道这些错误消息是什么意思。

许多其他c++程序都有扩展名为.cpp的源文件,所以我想可能需要重命名我的文件。我把它的名字改为helloworld.cpp,但这并没有帮助。我认为Clang有一个非常严重的错误,因为当我试图用它来编译重命名的程序时,它跳出来,打印出“84个警告和20个错误生成”,让我的计算机发出很多哔哔声!

我哪里做错了?我是否错过了c++标准的某些关键部分?或者这三个编译器真的坏到不能编译这个简单的程序?


当前回答

试试这个方法:

其他回答

您正在尝试编译一个映像。

将手写的内容输入一个名为main.cpp的文档,通过编译器运行该文件,然后运行输出文件。

你忘记使用Comic Sans字体,这就是它出错的原因。

第一个问题是,您试图在主函数的末尾返回一个不正确的值。c++标准规定main()的返回类型是int,但相反,您试图返回空集。

另一个问题是——至少在g++中——编译器从文件后缀推断出所使用的语言。从g++ (1):

对于任何给定的输入文件,文件 名称后缀决定了名称的种类 编译完成: 文件。cc文件。cp文件。c . cxx文件。cpp文件。cpp文件。c++文件 必须预处理的c++源代码。注意,在.cxx中 最后两个字母必须都是字面上的x。同样,. c指的是a 大写字母C。

修复这些问题将使您拥有一个正常工作的Hello World应用程序,从这里的演示可以看到。

在标准中,§2.1/1规定:

物理源文件字符在必要时以实现定义的方式映射到基本源字符集(为行结束指示符引入新行字符)。

你的编译器不支持这种格式(也就是不能将它映射到基本的源字符集),所以它不能进入进一步的处理阶段,因此出现了错误。你的编译器完全有可能支持从图像到基本源字符集的映射,但这不是必须的。

由于此映射是由实现定义的,因此需要查看实现文档以了解它支持的文件格式。通常,每个主要的编译器供应商都支持(规范定义的)文本文件:由文本编辑器生成的任何文件,通常是一系列字符。


注意,c++标准是基于C标准的(§1.1/2),C(99)标准在§1.2中说:

本国际标准没有规定 C程序被转换以供数据处理使用的机制 系统; C程序被数据处理调用的机制 系统; 输入数据转换为C程序使用的机制;

同样,源文件的处理方法需要在编译器文档中找到。

你的编译器设置为专家模式了吗?!如果是,它不应该编译。现代编译器已经厌倦了“Hello World!”