符号表 - c++链接




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

编写我编写的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 ++标准的一些关键部分吗? 还是所有三个编译器真的太破碎了,以至于无法编译这个简单的程序?


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

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

真的,这些错误并不难看懂。


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

这是非常好的,公平的。


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

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

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

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

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

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


你可以试试下面的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

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

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

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


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


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

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

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

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

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

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

因此,再次,源文件的处理是您需要在编译器文档中找到的东西。


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


您正在尝试编译图像。

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


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


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

:0}


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

我的几个员工(我是经理)正在为我购买带有旋钮的红色电脑之一。 他们说我不需要标记,我可以在屏幕满了时自己清理屏幕,但我必须小心翼翼地晃动屏幕。 我认为这很微妙。

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


我没有将您的程序从PNG转换为ASCII,但它尚未编译。 为了您的信息,我确实尝试了宽度为100和250的字符,但两者的结果都相当。

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

第一个问题是,你试图在主函数的末尾返回一个不正确的值。 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应用程序,从here的演示可以看出。


补充:

using namespace std;

之后包括:P:D


试试这个:


这个程序是有效的 - 我可以找到没有错误。

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

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

我讨厌病毒。


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

干杯,







clang