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

时间:2011-04-01 00:50:03

标签: c++ visual-c++ compiler-errors clang

编写我编写的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主干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 ++标准的一些关键部分?或者所有三个编译器真的如此破碎,以至于无法编译这个简单的程序?

31 个答案:

答案 0 :(得分:576)

最初来自Overv @ reddit

答案 1 :(得分:320)

尝试这种方式:

enter image description here

答案 2 :(得分:212)

您的<>(){}似乎并不匹配;尝试更好地绘制它们。

答案 3 :(得分:174)

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

  

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

您的编译器不支持该格式(也称不能将其映射到基本源字符集),因此无法进入进一步的处理阶段,因此错误。您的编译器完全有可能支持从映像到基本源字符集的映射,但不是必需的。

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


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

  

本国际标准未指明
   - C程序转换为数据处理使用的机制   系统;
   - 调用C程序以供数据处理使用的机制   系统;
   - 转换输入数据以供C程序使用的机制;

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

答案 4 :(得分:157)

您可以尝试以下python脚本。请注意,您需要安装PILpytesser

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

答案 5 :(得分:111)

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

答案 6 :(得分:76)

在最后一个支撑之后我看不到新线。

如您所知:“如果非空源文件不以换行符结尾,则行为未定义”。

答案 7 :(得分:75)

此程序有效 - 我找不到任何错误。

我的猜测是你的机器上有病毒。最好重新格式化驱动器,然后重新安装操作系统。

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

我讨厌病毒。

答案 8 :(得分:63)

我发现在我的显示器玻璃上用魔术标记写我的代码是有帮助的,尽管当它非常黑时看起来不错。屏幕填满太快,然后给我一个干净的显示器的人每周给我打电话。

我的几个员工(我是一名经理)正准备给我买一台带旋钮的红色电脑。他们说我不需要标记,我可以自己清洁屏幕,但是我必须小心摇晃它。我认为这样很精致。

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

答案 9 :(得分:60)

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

答案 10 :(得分:57)

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

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

答案 11 :(得分:49)

您是否手写程序然后将其扫描到计算机中?这就是“helloworld.png”所暗示的内容。如果是这种情况,您需要注意C ++标准(即使在其最新版本中)不需要存在光学字符识别,并且遗憾的是它不包含在任何当前编译器中作为可选功能。

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

如果您真的喜欢冒险,可以尝试将代码写入文字处理程序。打印它,最好使用OCR-A之类的字体。然后,将您的打印输出并重新扫描。然后可以通过第三方OCR包运行扫描以生成文本表单。然后可以使用许多标准编译器之一编译文本表单。

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

答案 12 :(得分:46)

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

#include <ChuckNorris>

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

答案 13 :(得分:41)

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

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

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

因此,我建议使用标准方法来告诉编译器以下代码是用C ++编写的。正如你现在所发现的那样,C ++编译器非常挑剔他们所接受的东西。因此,识别C ++的标准方法是通过恐吓程序员添加到他们的C ++代码中。例如,以下行将向您的编译器说明接下来是C ++(并且他最好在没有抱怨的情况下编译它)。

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

答案 14 :(得分:33)

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

答案 15 :(得分:33)

试试这个:

Do you see the dinosaur in the space shuttle?

答案 16 :(得分:27)

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 _ |
_|

这是非常好的,公平。

答案 17 :(得分:26)

  

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

显然,您应该格式化硬盘。

真的,这些错误并不难读。

答案 18 :(得分:21)

我确实将您的程序从PNG转换为ASCII,但它还没有编译。为了您的信息,我尝试使用行宽100和250个字符,但两者都得到了相似的结果。

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

答案 19 :(得分:16)

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

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

  

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

     

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

     

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

修复这些应该会为您提供一个完整的Hello World应用程序,如演示here所示。

答案 20 :(得分:15)

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

答案 21 :(得分:13)

您的编译器需要 ASCII ,但该程序显然使用 EBCDIC 编写

答案 22 :(得分:8)

您正在尝试编译图像。

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

答案 23 :(得分:7)

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

<强>:0}

答案 24 :(得分:6)

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

答案 25 :(得分:6)

添加:

using namespace std;

之后包括:P:D

答案 26 :(得分:5)

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

答案 27 :(得分:5)

您可以尝试不同颜色的支架,也许一些绿色或红色会有帮助吗? 我认为你的编译器无法识别黑色墨水:P

答案 28 :(得分:5)

问题在于语法定义,尝试使用标尺和罗盘来获得更经典的描述!

干杯,

答案 29 :(得分:5)

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

答案 30 :(得分:4)

通过OCR运行编译器。它可能会解决兼容性问题。