【问题标题】:Why does the g++ compiler add spaces between every character in my cpp file?为什么 g++ 编译器在我的 cpp 文件中的每个字符之间添加空格?
【发布时间】:2018-06-16 04:11:14
【问题描述】:

我正在尝试编译 3 个 cpp 文件,其中只有一个,Linux 上的 g++ 编译器正在读取每个字符之间的空格,导致无法编译。我得到数百甚至数千个x.cpp:n:n: warning: null character(s) ignored(其中 x 是名称,n 是数字)。我在 Visual Studio 中编写了程序,然后将它们复制到了 linux。其他 2 个文件编译得很好,我已经为几十个项目做了这个。这是怎么发生的?

我设法通过创建一个新文件并从原始 cpp 复制文本而不是复制文件来解决此问题。

现在,当我尝试启动 .o 文件时,我从终端收到错误消息 Permission Denied

【问题讨论】:

  • 我很确定通过 linux/windows 换行可能会有所不同。从一个操作系统复制一个文件并在另一个操作系统中读取它而没有兼容性问题并不总是一件简单的事情。可能在复制/粘贴操作期间它会自动修复换行符以对 linux 编译器更友好
  • 权限被拒绝,可能完全是另外一回事
  • 查找 dos2unix(如果从 Windows 机器获取文件到 unix)和 unix2dos(如果采用其他方式)。换行符(特别是)和其他字符的处理是不同的,这些程序会相应地过滤文件。原因与您传输文件的方式有关(例如,在二进制与文本模式下)。
  • .o 文件是目标文件,不可执行。因此你得到“权限被拒绝”,系统不允许运行目标文件。
  • @Ken White 我通常不会复制/粘贴代码,但我必须这样做才能解决这个问题。行尾甚至不是这里的问题。问题是在以前没有空格的字符之间添加了空格。我一直在做的是在 Visual Studio 中编写代码并复制 cpp 文件。直到现在,这从来都不是问题,它只发生在复制的 4 个文件中的一个上

标签: c++ compiler-errors g++


【解决方案1】:

您的编译器问题与换行无关。

您正在尝试编译保存为 UTF-16 (Unicode) 的文件。如果文件包含任何非 ASCII 字符,Visual Studio 将在您背后执行此操作。

解决方案 1(推荐):坚持使用 ASCII。那么问题根本就不会出现。

解决方案 2:在 Visual Studio 中将文件保存为 UTF-8,如 here 所述。您可能需要按照here 所述保存不带 BOM(字节顺序标记)的文件。

WRT 你的其他问题,寻找一个名为a.out 的文件(是的,真的)并尝试运行它。并且不要在 g++ 命令行中指定-c

【讨论】:

  • 您的版本(如果 Visual Studio 可能已过时)。在 VS 2015.3 中,当我在新项目的 cpp 文件中添加“你好,?”时,系统询问我是否要将其转换为“Unicode”。 “是”导致带有 BOM 的 UTF-8。 (顺便说一句,不读取、使用和丢弃 BOM 的 Unicode 文本阅读器是不合规的,无论是否推荐用于 UTF-8。)
  • @TomB 很有趣。我刚刚进行了一些快速测试,我的版本(VS 2017)将这样的文件(我使用了那个字符)保存为 UTF-8 没有 BOM,它在没有提示我的情况下执行了此操作。我确信这种行为在最近的某个时候发生了变化,因为 VS 曾经在没有告诉我的情况下将我的一个 .rc 文件保存为 UTF-16,并且它与我的源代码控制系统玩得很开心。我还检查了 MSVC 是否会编译该文件,无论是否有 BOM,它都做得很好。 g++ 是否会理解 BOM 我不知道,但希望如此。
  • @TomB 无论如何,这都是好消息。我不知道 OP 使用的是什么版本的 VS,也不知道他的文件是如何转换为 UTF-16 的,我只知道他最终得到的结果。但希望 Visual Studio 不会再对我们造成这种特殊形式的痛苦,哈利路亚。干得好 M$,你来了。 OP 请记下这次对话,了解我们在这里发现的内容可能对您很重要。
【解决方案2】:

没有文字,只有编码的文字。

教条推论:

作者为文本文件选择字符编码。

读者必须知道它是什么。

任何类型的共同理解都可以:规范、约定、内部标记、传输时的元数据……。 (在某些情况下,即使是上个世纪的转换方式也可以。)


看来你 1) 不知道你选择了什么。 2)当您在系统之间复制文件时没有带上这些知识,并且 3)没有告诉 GCC。

不幸的是,存在一种隐藏这些基本沟通需求的文化,而不是用心去做;所以,你的经历太普通了。

告诉 GCC,

g++ -finput-charset=utf-16

显然,如果您正在使用某种项目系统,该系统支持跟踪相关文本文件的所需元数据并将其传递工具,那将是首选。


您可以尝试采用UTF-8 Everywhere。这不会消除沟通的需要(可能直到本世纪中叶),但它可以使它更令人愉快。

【讨论】:

  • 看来你……不知道你选择了什么好吧,公平地说,他根本没有做出有意识的选择,这就是为什么他来寻求帮助。他明白了,这就是这个网站存在的原因。
  • @PaulSanders 是的,没有做出有意识的选择是人们必须被引导的问题。这是本着乐于助人的精神。
  • 是的,明白了。
猜你喜欢
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 2018-03-10
相关资源
最近更新 更多