错误:C++程序中的偏离'\XXX':为什么会发生这种情况?

13

我在写一个 C++ 小程序时,遇到了一个奇怪的错误:

src/Makefile/Tool.cpp:42:3: error: stray ‘\302’ in program
src/Makefile/Tool.cpp:42:3: error: stray ‘\240’ in program
我正在使用Vim编写此程序,相应的行显示了隐藏字符:
>--->---std::vector<std::string> { "--debug" }$

这个问题并不是关于如何解决这个错误,因为我只需要复制回该行,错误就会消失。

似乎这些错误是由某些字符引起的,即使在激活所有相关选项后,这些字符也被Vim隐藏了!

问题是这些错误是由什么引起的。


1
@Nawaz:这些是vim列表字符(可见的空白符)。 - Cat Plus Plus
5
他们是可上色的。可见的空白区域是一件好事。 - Cat Plus Plus
1
这个特定的杂散字符是通过 Skype 聊天复制粘贴代码时观察到的。 - Peter Mortensen
在不同的上下文环境中(例如 Windows 上的 PowerShell 脚本),相同的字符会导致以下结果:““Â : The term 'Â' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. ... CategoryInfo : ObjectNotFound: (Â:String) [], CommandNotFoundException ... FullyQualifiedErrorId : CommandNotFoundException” - Peter Mortensen
1
这个回答解决了你的问题吗?[编译错误:程序中有杂项‘\302’等] (https://dev59.com/ymIk5IYBdhLWcg3wg-fK) - Karl Knechtel
显示剩余5条评论
4个回答

23

"\302\240" 是表示 U+00A0 不间断空格 的 UTF-8 编码。在 Vim 中,它通常不会被特别突出显示,因此即使启用了 'list' 模式,也有可能被忽略。

您可以使用以下方法对其进行突出显示:

:set listchars+=nbsp:.

或者你喜欢的任何字符。


4
@Geoffroy 你确定没有从网页或手册之类的地方复制粘贴代码吗?我需要确认一下。 - hobbs
1
@Geoffroy,你的键盘布局是什么?我的是BÉPO,我可以轻松地用Shift-space插入NBSP。 - Benoit
默认的 Mac OS 法语键盘上,这个字符不容易输入。 - Geoffroy
如果有人像我一样差点错过了@xoolive的评论,你可以在Vim中使用:%s/\%o302//g来替换它们,你可能还需要:%s/\%o240//g - ordonezalex
302和240是八进制数(十进制194 160。十六进制0xC2 0xA0)。 - Peter Mortensen
显示剩余5条评论

10
如前所述,这是由于您源代码中存在一些不可见字符所致。
解决此问题的一个好方法是在八进制模式下编辑文件,这样您就能够“看到”这些字符了:
od -c MyClass.hpp

接下来,您可以在八进制流中看到“陌生人”:

0001240   t       s   t   r   i   n   g   &       n   a   m   e       )
0001260       { **302 240**   t   h   i   s   -   >   n   a   m   e       =
0001300       n   a   m   e   ;       }  \n  \n  \n  \t  \t  \t  \t   /

这两个加粗的字符是导致出现以下错误信息的原因:

error: stray ‘\302’ in program

您可以将它们删除,然后重新构建。


1
你的解决方案很好,解释得很清楚,而且适用于任何其他字符 ;) - Geoffroy
平台应该被说明。它是Linux吗? - Peter Mortensen
一个类似的综合答案(适用于Windows):https://dev59.com/ymIk5IYBdhLWcg3wg-fK#54352836 - Peter Mortensen

0

我遇到了同样的问题,这是因为每行前面的空格字符编码不正确。这是由于从与Exchange ServeriCloud同步的笔记程序中复制而来。我所需要做的就是使用记事本应用和替换所有奇怪的空格字符为普通的空格字符,然后一切都可以正常编译了。


0
对我来说,这个问题是由于从Web浏览器复制我的代码而导致的。
我尝试在Vim中使用“:%s/ / /g”将所有空格替换为实际空格,但失败了。
我删除了所有报告此错误的行的前导空格,并再次插入了空格字符。虽然这很费力,但似乎是我能找到的唯一解决方案。

1
如果出现了\302这个字符串,你可以使用:% s,\%o302,,g来处理。 - xoolive
没有必要手动处理,可以通过使用 Unicode 代码点的正则表达式搜索/替换 - \x{00A0} 来完成。如果 Vim 不能做到,我会感到惊讶。在 Notepad++(Windows)和 Geany(Linux)中都能很好地工作。 - Peter Mortensen
注意:在Visual Studio Code(以及可能的其他编辑器)中,符号表示不同:\u00A0(而不是\x{00A0})。 - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接