小编典典

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

all

我在编译我编写的 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++ 标准的一些关键部分?还是这三个编译器真的都坏到无法编译这个简单的程序?


阅读 126

收藏
2022-03-14

共1个答案

小编典典

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

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

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

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


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

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

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

2022-03-14