为什么这个程序会被三个c++编译器错误地拒绝?

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

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

程序如下:

enter image description here

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

359229 次浏览

添加:

using namespace std;

包括:P:D

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

你是手写程序然后扫描到电脑里的吗?这就是“helloworld.png”所暗示的内容。如果是这种情况,您需要注意c++标准(即使在其最新版本中)不需要光学字符识别,不幸的是,当前任何编译器都不包含光学字符识别作为可选特性。

您可能需要考虑将图形转换为文本格式。任何纯文本编辑器都可以使用;使用文字处理器,虽然能够生成漂亮的打印输出,但很可能会导致您在尝试扫描时遇到的相同错误。

如果你真的有冒险精神,你可以尝试把你的代码写进文字处理器。打印出来,最好使用OCR-A这样的字体。然后,把打印出来的文件扫描回来。然后,扫描可以通过第三方OCR包运行,以生成文本表单。然后可以使用许多标准编译器之一来编译文本表单。

但是,要注意在调试阶段会产生大量的纸张成本。

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

您可以尝试下面的python脚本。注意,你需要安装公益诉讼pytesser

from pytesser import *
image = Image.open('helloworld.png')  # Open image object using PIL
print image_to_string(image)     # Run tesseract.exe on image

要使用它,请执行:

python script.py > helloworld.cpp; g++ helloworld.cpp

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

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

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

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


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

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

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

你的<>(){}似乎不太匹配;试着把它们画得更好。

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

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

我看不出上一个大括号后面有一条新线。

如你所知:“如果一个非空的源文件没有以换行符结尾,……行为是未定义的”。

这个程序是有效的——我找不到错误。

我猜你的电脑里有病毒。最好是重新格式化驱动器,重新安装操作系统。

让我们知道这是如何工作的,或者如果你需要帮助重新安装。

我讨厌病毒。

似乎你的编译器不支持这样的文件嗯…编码。试着把它转换成ASCII。

.

最初来自Overv @ reddit

我发现不用神奇的记号笔在显示器的玻璃上写代码很有帮助,尽管当它真的是黑色的时候看起来很漂亮。屏幕很快就满了,然后给我一个干净显示器的人每周都骂我。

我的几个员工(我是经理)出钱给我买了一台带旋钮的红色平板电脑。他们说我不需要记号笔,屏幕满了我可以自己清理,但我得小心摇晃。我想那是很微妙的。

这就是我雇佣聪明人的原因。

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

问题在于语法定义,尝试使用尺子和圆规来进行更经典的描述!

欢呼,

你需要用冒号紧接在最后的结束大括号之前来指定输出的精度。由于输出不是数字,精度为零,所以需要这个-

: 0}

不幸的是,您选择了三个支持多种语言的编译器,而不仅仅是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?

我把你的程序从PNG转换成ASCII,但它还没有编译。供您参考,我确实尝试了线宽为100和250个字符,但都产生了类似的结果。

   `         `  .     `.      `         ...
+:: ..-.. --.:`:. `-` .....:`../--`.. `-
`      `       ````
`
` `` .`       ``    .`    `.               `` .      -``-          ..
.`--`:`   :::.-``-. : ``.-`-  `-.-`:.-`    :-`/.-..` `    `-..`...- :
.`         ` `    ` .`         ````:``  -                  ` ``-.`  `
`-                                ..                           ``
.       ` .`.           `   `    `. ` .  . `    .  `    . . .` .`  `      ` ``        ` `
`:`.`:` ` -..-`.`-  .-`-.    /.-/.-`.-.  -...-..`- :```   `-`-`  :`..`-` ` :`.`:`- `
``  `       ```.      ``    ````    `       `     `        `    `         `   `   .
: -...`.- .` .:/ `
-       `             `` .
-`
`

你的字体糟透了,解析器怎么能读懂呢?参加书法课程。

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

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

尝试切换输入接口。c++要求将键盘插入计算机,而不是扫描仪。这里可能有外围设备冲突的问题。如果键盘输入接口是强制性的,我没有检查ISO标准,但这对我使用过的所有编译器都是正确的。但也许扫描器输入现在在C99中可用,在这种情况下,你的程序应该确实工作。如果没有,你将不得不等待下一个标准版本和编译器的升级。

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

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

你的编译器期望美国信息交换标准代码,但该程序是用EBCDIC编写的很明显

绘制下面的include使其编译:

#include <ChuckNorris>

我听说他能编译语法错误……

试试这个:

你看到航天飞机里的恐龙了吗?

OCR说:

N lml_�e <loJ+_e__}


.lnt Mk.,n ( ln+ _rSC Lhc_yh )
h_S_
_l


s_l . co__ <, " H llo uo/_d ! '` << s l� . ena_ .
TP__rn _ |
_|

公平地说,这真是太好了。

文件格式不被识别

显然,你应该格式化你的硬盘。

实际上,这些错误并不难读懂。

试试这个方法:

enter image description here

我是唯一一个不认识“return”和分号之间的字符的人吗?可能就是这样!

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

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

对于任何给定的输入文件,文件 名称后缀决定了名称的种类 编译完成:

文件。cc文件。cp文件。c . cxx文件。cpp文件。cpp文件。c++文件

必须预处理的c++源代码。注意,在.cxx中 最后两个字母必须都是字面上的x。同样,. c指的是a

修复这些问题应该会让你有一个完全正常工作的Hello World应用程序,正如可以从演示在这里中看到的那样。