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

Jam*_*lis 469 c++ compiler-errors clang visual-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
Run Code Online (Sandbox Code Playgroud)

沮丧,我尝试了g ++ 4.5.2,但同样无益:

c:\dev>g++ helloworld.png
helloworld.png: file not recognized: File format not recognized
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我认为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)
Run Code Online (Sandbox Code Playgroud)

说实话,我真的不知道这些错误信息是什么意思.

许多其他C++程序的源文件扩展名为.cpp,所以我想也许我需要重命名我的文件.我改名为helloworld.cpp,但这没有用.我认为Clang中存在一个非常严重的错误,因为当我尝试使用它来编译重命名的程序时,它会翻出来,打印出"84个警告和20个错误".并使我的电脑发出很多嘟嘟声!

我在这做错了什么?我是否错过了C++标准的一些关键部分?或者所有三个编译器真的如此破碎,以至于无法编译这个简单的程序?

Sve*_*ven 575

最初来自Overv @ reddit.

  • 最好的事物。BMP 格式。规格说明。曾经。 (19认同)

Ben*_*oit 320

试试这种方式:

在此输入图像描述


Bal*_*a R 211

<>,(),{}似乎并不匹配得非常好; 尝试更好地绘制它们.

  • 虽然我不感谢你取笑我的笔迹,但这可能是真正的问题,并且可以解释当我尝试使用Visual C++编译重命名的_helloworld.cpp_时出现的错误:"致命错误C1004:意外的结束 - 找到文件"我会再试一次并尽快回复.谢谢! (44认同)
  • @James确保关闭所有png优化.它使调试更容易. (37认同)
  • @James:“意外的文件结尾”几乎肯定意味着是您的 `}` 导致了问题。尝试专注于将其与 `{` 匹配 (5认同)

GMa*_*ckG 173

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

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

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

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


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

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

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

  • 我认为这句话充其量是模棱两可的.Merriam-Webster字典说_text_是_原始的单词和形式的书面或印刷作品_或_a包含这样的text_的作品.该源文件显然属于该定义.您认为我应该向核心语言工作组提交缺陷报告吗? (23认同)
  • 哦; 我完全忘记阅读所有参考文件。不过,我认为这一段是断章取义,所以我将去阅读 ISO/IEC 9899:1990 的全部内容,并在我完全理解后发回这里。 (15认同)

sje*_*397 156

您可以尝试以下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
Run Code Online (Sandbox Code Playgroud)

要使用它,请执行:

python script.py > helloworld.cpp; g++ helloworld.cpp
Run Code Online (Sandbox Code Playgroud)


bl0*_*ter 110

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

  • 不幸的是,这是我的手支持的唯一字体。如果我因此无法用 C++ 编程,那将是非常可悲的。你认为 Java 会支持这种字体吗? (73认同)
  • 无论如何,当您想到画漫画时,您将需要 Comic Sans,因此您应该认真考虑升级手。 (8认同)
  • C++ 需要为期一年的书法培训。如果您没有时间,请尝试使用 Visual Basic 或仅使用二进制机器代码(然后您只需正确获取 0 和 1)。 (8认同)

Mic*_*urr 75

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

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

  • 嗯。幸运的是,这个荒谬的规则已在 C++0x 中删除。也就是说,如何用换行符结束这样的文件?我以为我在文本末尾留下了足够的空间(如果您突出显示源文件,您应该看到我留下的额外空间)。谢谢你的提示,不过! (16认同)
  • 如果你没有足够的空格,我可以尝试在我的系统上编译它。我有四台显示器,所以我可以尝试从最左边的一台进行编译。 (8认同)

Jer*_*her 74

这个程序有效 - 我找不到任何错误.

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

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

我讨厌病毒.

  • 是的,尝试安装 Linux。我把你的问题归咎于 Windows。 (17认同)

the*_*Man 62

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

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

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

  • 我有一个“Life Like”显示器很长一段时间了。它是如此逼真,你会发誓游泳鱼的屏幕保护程序是真实的,而小潜水员看起来就像在游泳。我不断地把手弄湿,试图从底部取出宝箱,它是如此真实。唯一的问题是屏幕保护程序始终处于开启状态,逼真的冒泡噪音让人难以听到。哦,他们说为了维护,我必须每天在显示器顶部洒一些东西,否则屏幕保护程序将停止工作。它做过一次,男孩,两天后的气味真的很逼真。 (7认同)
  • Wacom Cintiq 更适合经理。它很贵,让你觉得很重要。贵公司的任何图形设计师的地位都会低得多,因此应该使用 EGA 显示器。看门人应该使用 CGA 监视器。程序员应该使用二手单色终端。 (2认同)

hel*_*922 59

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

  • 哦,那是有道理的...我有一盒 96 支蜡笔,所以我确定我有正确的前景色。明天我会拿起一些彩色的建筑纸,在不同颜色的纸上试一试。 (14认同)
  • @sharptooth - 语法高亮是 IDE 的一项功能 - 您不应该手动完成。所以确保你有一个机械臂来搭配那个高亮标记。 (6认同)
  • 为了安全起见,您最好也准备一些着色铅笔和油性涂料。众所周知,C++ 是一种很难正确格式化的语言。 (3认同)

And*_*per 56

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

pngtopnm helloworld.png | ocrad | g++ -x 'c++' -
Run Code Online (Sandbox Code Playgroud)

  • 哦!我认为预处理器包含在编译器中!我将尝试找到适用于我的 Windows 笔记本电脑的预处理器。 (8认同)
  • @James McNellis:预处理器不是一个程序,它是一个硬件,看起来像一个高亮标记——你将它移动到文本上并进行预处理。 (3认同)

Kev*_*ent 49

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

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

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

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

  • +1:感谢您在调试阶段拯救地球! (14认同)
  • 嗯,呃,你使用汇编原始 OCR。 (5认同)
  • 哦,ASM,是的![打孔卡片中的ASM](http://en.wikipedia.org/wiki/File:IBM1620SPSpunchcard.agr.jpg). (2认同)

Gro*_*fit 46

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

#include <ChuckNorris>
Run Code Online (Sandbox Code Playgroud)

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

  • 我个人更喜欢`#include <JonSkeet>`. (46认同)

MSa*_*ers 40

不幸的是,您选择了三个都支持多种语言的编译器,而不仅仅是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?
Run Code Online (Sandbox Code Playgroud)

  • 我认为`#pragma`是向编译器"获取消息"的正确方法? (10认同)

Chr*_*ore 33

试试这个:

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

  • 我已经盯着这个看了三个小时,但我仍然看不到恐龙或航天飞机。:-( (44认同)
  • 我认为有一个错字 - 应该是`endl`(L)而不是`end1`(一个)。但是+1做得很好! (4认同)

zam*_*shi 32

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


Rob*_*ett 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 _ |
_|
Run Code Online (Sandbox Code Playgroud)

这是非常好,公平.

  • 我想我们需要添加一个Perl标签. (40认同)
  • 哇,自从我试图扫描我的笔迹以来,OCR已经有所改进(花了好几个小时写完). (4认同)

Chr*_*ore 26

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

显然,你应该格式化硬盘.

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


小智 20

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

   `         `  .     `.      `         ...                                                         
   +:: ..-.. --.:`:. `-` .....:`../--`.. `-                                                         
           `      `       ````                                                                      
                                                                      `                             
   ` `` .`       ``    .`    `.               `` .      -``-          ..                            
   .`--`:`   :::.-``-. : ``.-`-  `-.-`:.-`    :-`/.-..` `    `-..`...- :                            
   .`         ` `    ` .`         ````:``  -                  ` ``-.`  `                            
   `-                                ..                           ``                                
    .       ` .`.           `   `    `. ` .  . `    .  `    . . .` .`  `      ` ``        ` `       
           `:`.`:` ` -..-`.`-  .-`-.    /.-/.-`.-.  -...-..`- :```   `-`-`  :`..`-` ` :`.`:`- `     
            ``  `       ```.      ``    ````    `       `     `        `    `         `   `   .     
            : -...`.- .` .:/ `                                                                      
    -       `             `` .                                                                      
    -`                                                                                              
    `                                                                                               
Run Code Online (Sandbox Code Playgroud)

  • 您应该使用[80或甚至72列](http://en.wikipedia.org/wiki/Punched_card#IBM_80_column_punched_card_format)代替 (8认同)

Ant*_*ine 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指的是文字资本C.

修复这些应该会为您提供一个完整的Hello World应用程序,这可以从这里的演示中看到.

  • 我有一个教授回来的时候,如果你把一个斜线穿过一个零数字,那么谁会把你的作业或考试取下来,因为零不是空集.他会很感激这个答案. (3认同)

Fra*_*eld 15

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


oos*_*wal 13

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


小智 8

你正在尝试编译图像.

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

  • 检查电脑上的日期. (23认同)
  • 哈哈,但我终于找到了一个我能回答的简单! (14认同)
  • 这太傻了.我们都知道编译器会优化空白区域,只留下严重压缩的黑色空间,这就是全部,并将压缩到二进制1,这将作为错误返回.需要使用white-out编写代码,编译为0并且不返回错误. (10认同)

Mik*_*-UK 7

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

:0}


Spy*_*ros 5

添加:

using namespace std;
Run Code Online (Sandbox Code Playgroud)

之后包括:P:D

  • 我更喜欢一直输入`std`.提醒我不要一个. (5认同)

Kir*_*sky 5

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


小智 5

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

干杯,


kri*_*iss 5

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


小智 5

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


tec*_*lic 5

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

  • 它是一个大写字母O,带有一个我们称之为"直径"的特殊线,它告诉编译器显然使用中点圆算法.我想你应该检查你的眼睛. (4认同)