我在编译我写的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++标准的某些关键部分?或者这三个编译器真的坏到不能编译这个简单的程序?


当前回答

无法识别文件格式您需要正确格式化您的文件。这意味着为代码使用正确的颜色和字体。查看每个编译器的具体文档,因为这些颜色在不同的编译器之间有所不同;)

其他回答

不幸的是,您选择了三个支持多种语言的编译器,而不仅仅是c++。他们都必须猜测你使用的编程语言。您可能已经知道,PNG格式适用于所有编程语言,而不仅仅是c++。

通常编译器可以自己找出语言。例如,如果PNG显然是用蜡笔绘制的,编译器就会知道它包含Visual Basic。如果它看起来像是用机械铅笔画的,那么很容易认出正在写FORTRAN代码的工程师。

在本例中,第二步对编译器也没有帮助。C和c++看起来太相似了,甚至连#include都不例外。因此,你必须帮助编译器决定它到底是什么语言。现在,你可以使用非标准方法。例如,Visual Studio编译器接受/TC和/TP命令行参数,或者你可以在项目文件中使用“Compile as: c++”选项。GCC和CLang有自己的机制,我不知道。

因此,我建议使用标准方法来告诉编译器下面的代码是用c++编写的。正如您现在所发现的,c++编译器对它们所接受的内容非常挑剔。因此,识别c++的标准方法是通过恐吓程序员添加到他们的c++代码。例如,下面这行代码会告诉编译器下面的代码是c++(编译时最好不要抱怨)。

// To the compiler: I know where you are installed. No funny games, capice?

你忘了预处理器。试试这个:

pngtopnm helloworld.png | ocrad | g++ -x 'c++' -

通过OCR运行编译器。这也许能解决兼容性问题。

您的编译器期望ASCII,但该程序显然是使用EBCDIC编写的。

你可以尝试不同颜色的括号,也许绿色或红色会有帮助? 我认为你的编译器不能识别黑墨水:P