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

编写一个我编写的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版本的主干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 ++标准的一些关键部分吗? 还是三个编译器真的太破碎了,不能编译这个简单的程序?

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

如果需要,物理源文件字符以实现定义的方式映射到基本源字符集(为行尾指示符引入新行字符)。

你的编译器不支持这种格式(又不能把它映射到基本的源字符集 ),所以它不能移动到进一步的处理阶段,因此错误。 编译器支持从映像到基本源字符集的映射是完全可能的,但不是必需的。

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


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

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

因此,源文件的处理也是您需要在编译器文档中find的。

最初来自Overv @ reddit 。

试试这个方法:

在这里输入图像描述

你的<>(){}似乎不太匹配。 尝试绘制它们更好。

你可以尝试下面的python脚本。 请注意,您需要安装PIL和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 

你忘记使用Comic Sans作为字体,这就是为什么它的错误。

在最后一个大括号之后,我看不到一条新线。

正如你所知道的:“如果一个非空的源文件不是以换行符结束,那么行为是不确定的”。

这个程序是有效的 – 我可以find没有错误。

我的猜测是你的机器上有病毒。 如果您重新格式化驱动器并重新安装操作系统,那将是最好的。

让我们知道如何解决,或者如果你需要帮助重新安装。

我讨厌病毒。

我发现它不会在我的显示器的玻璃上用魔术记号笔写我的代码,虽然它看起来不错,但是它真的很黑。 屏幕填满太快,然后给我一个干净的显示器的人每周给我打电话。

我的一些雇员(我是一名经理)正在为我购买一台带有旋钮的红色平板电脑。 他们说,我不需要标记,我可以自己清理屏幕,但我必须小心翼翼的摇晃。 我认为这是微妙的。

这就是我聘请聪明人的原因。

File format not recognized您需要正确格式化您的文件。 这意味着为您的代码使用正确的颜色和字体。 查看每个编译器的具体文档,因为这些颜色因编译器而异;)

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

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

你是否手写程序,然后扫描到计算机? 这就是“helloworld.png”所暗示的。 如果是这样的话,你需要知道C ++标准(即使在最新版本中)不需要光学字符识别的存在,不幸的是,它不被包括在任何当前编译器中的可选特征中。

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

如果你真的冒险,你可以尝试写你的代码到一个文字处理器。 打印它,最好使用像OCR-A这样的字体。 然后,将您的打印输出并重新扫描。然后可以通过第三方OCR包运行扫描以生成文本表单。 然后可以使用许多标准编译器之一来编译文本形​​式。

但是,要小心在debugging阶段会产生巨大的纸张成本。

绘制下面的包含以使其编译:

 #include <ChuckNorris> 

我听说他可以编译语法错误…

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

通常编译器可以找出语言本身。 例如,如果PNG显然是用蜡笔绘制的,编译器就会知道它包含了Visual Basic。 如果它看起来像是用自动铅笔绘制的,那么很容易在工作中识别工程师,编写FORTRAN代码。

在这种情况下,第二步也不能帮助编译器。 C和C ++看起来太相似了,直到#include 。 因此,你必须帮助编译器确定它是什么语言。 现在,你可以使用非标准的手段。 例如,Visual Studio编译器接受/ TC和/ TP命令行参数,或者可以在项目文件中使用“编译为:C ++”选项。 海合会和克朗有自己的机制,我不知道。

因此,我build议使用标准方法来告诉你的编译器,下面的代码是用C ++编写的。 正如你现在发现的那样,C ++编译器对于他们接受的东西非常挑剔。 因此,识别C ++的标准方法是由威胁程序员添加到他们的C ++代码中。 例如,下面的代码将向你的编译器澄清,接下来的是C ++(他最好不用抱怨地编译它)。

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

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

试试这个:

你在航天飞机上看到恐龙吗?

OCR说:

 N lml_ e <loJ+_e__} .lnt Mk.,n ( ln+ _rSC Lhc_yh ) h_S_ _l s_l . co__ <, " H llo uo/_d ! '` << sl  . ena_ . TP__rn _ | _| 

这是非常好的,公平的。

helloworld.png:文件无法识别:文件格式无法识别

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

真的,这些错误是不难看出来的。

我没有将您的程序从PNG转换为ASCII,但是还没有编译。 为了您的信息,我确实尝试了线宽100和250个字符,但都产生了可比的结果。

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

第一个问题是,你正试图在主函数的末尾返回一个不正确的值。 C ++标准规定main()的返回types是int,但是你试图返回空集合。

另一个问题是 – 至less在g ++中 – 编译器从文件后缀中推导出使用的语言。 来自g ++(1):

对于任何给定的input文件,文件名后缀决定了什么样的编译完成:

file.cc file.cp file.cxx file.cpp file.CPP file.c ++ file.C

C ++源代码,必须预处理。 请注意,在.cxx中,最后两个字母必须是字面x。 同样的,C代表一个文字大写C.

解决这些问题应该给你一个完整的Hello World应用程序,从这里的演示可以看出。

你的字体很糟糕,parsing器应该如何读取? 参加书法课程。

你的编译器需要ASCII ,但是这个程序显然是用EBCDIC编写的。

你正试图编译一个图像。

input你手头写入名为main.cpp的文件,通过编译器运行该文件,然后运行输出文件。

您需要在最后一个右大括号之前指定输出的前面加上冒号的精度。 由于输出不是数字,所以精度为零,所以你需要这个 –

:0}

加:

 using namespace std; 

之后包括:P:D

似乎你的编译器不支持这样的HMM编码文件。 尝试将其转换为ASCII。

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

干杯,

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

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

我是唯一一个无法识别“返回”和分号之间的字符的人吗? 这可能是!