【问题标题】:Stray '\342' in program when doing comparisons with negative numbers与负数进行比较时,程序中出现杂散“\342”
【发布时间】:2014-06-07 20:07:08
【问题描述】:

每当我与负数进行比较时,GCC 都会向我显示:

error: stray '\342' in program
   if ( -4 < ÔÇô3 ) return 1;
   ^
compilation terminated due to -Wfatal-errors.

代码:

int main() {
  if ( -4 < –3 ) return 1;
  return 0;
}

【问题讨论】:

  • 使用合适的文本编辑器编写代码。
  • 我认为很明显哪个角色导致了问题。这是一个改变的连字符。愚蠢的website 没有办法分享我可以看到的结果,但是i.imgur.com/Q6QtHCm.png。将其与normal hyphen 进行比较。
  • 你没有漏掉接下来报告的两个杂散字符(在这种情况下它们形成一个单元)?其中许多以 342(八进制)开头:U+200B (342 200 213, ZERO WIDTH SPACE), U+2013 (342 200 223, EN DASH), U+2014 (342 200 224, EM DASH) 和U+2212 (342 210 222, MINUS SIGN)。
  • OK,这里贴出的代码,最接近源代码的是342 200 223。342 200 223(八进制)→0xE2 0x80 0x93(十六进制)→Unicode代码点U的UTF-8序列+2013 (EN DASH)。大多数具有regular expression 模式的文本编辑器(例如Geany(Linux 和Windows)和Notepad++)将能够使用\x{2013} 搜索/替换Unicode 代码点U+2013。

标签: c++ gcc compiler-errors


【解决方案1】:

数字 3 之前的破折号是一个 Unicode 字符,看起来像破折号。删除它,然后插入一个新的破折号,就可以了。

如果您使用复制粘贴,请注意,因为粘贴的代码可能包含 Unicode 字符,这可能会导致这样的编译错误。

如果您手动将其输入到编辑器中,请使用其他编辑器或更改编辑器的设置,不要将标准连字符转换为其他字符。例如,Microsoft Word 会进行这种转换,但我希望您没有在 Word 中编写代码。


错误信息的解释:

您以 UTF-8 字符集保存了文件。您使用的更改后的连字符保存为三个连续字节:0xE2 0x80 0x93(十六进制值)

g++ 逐字节解析文件。它首先遇到0xE2,它认为它无效并输出error: stray '\342' in program3420xE2 的八进制表示。而\342 是有效的 C++ 代码,它是 0xE2 字符的转义版本。详见C++escape sequences\nnn表示八进制nnn数字所代表的字符。

【讨论】:

  • 如果您不使用自动将- 转换为 的编辑器,您将不会有任何问题。我认为这不是一个安全的假设:如果是,OP 就不会问这个问题。
  • @hvd 感谢您的评论,我已经更新了答案。我怀疑幕后有一些复制粘贴。
猜你喜欢
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
相关资源
最近更新 更多