最近有人给我发了几个.cpp
源代码文件。在用GNU Emacs或GVIM打开文件时,我发现它们在^M
每一行的末尾附近有一个奇怪的字符。
这是一个显示我的意思的屏幕截图
当我用Gedit打开这些相同的源文件时,我看不到这些^M
字符。我该怎么办?这里有许多文件存在问题,因此通过替换空字符串来打开和执行搜索替换操作看起来像是一个反向操作。
奇怪的是,当我用GCC编译时,这些文件编译得很干净。这里发生了什么。我该怎么办?
最近有人给我发了几个.cpp
源代码文件。在用GNU Emacs或GVIM打开文件时,我发现它们在^M
每一行的末尾附近有一个奇怪的字符。
这是一个显示我的意思的屏幕截图
当我用Gedit打开这些相同的源文件时,我看不到这些^M
字符。我该怎么办?这里有许多文件存在问题,因此通过替换空字符串来打开和执行搜索替换操作看起来像是一个反向操作。
奇怪的是,当我用GCC编译时,这些文件编译得很干净。这里发生了什么。我该怎么办?
Answers:
在Unix中,新行字符是\n
,而在Windows中则是\r\n
。\r
或者^M
是回车符。
如果文件是在Windows模式下的编辑器中写入的,则每个新行字符都将包含回车符。如果你告诉你的编辑(如果它理解的话)在windows中处理新的行字符,你就不会再看到这些^M
字符了。
或者,您可以dos2unix
在代码库上运行以解决此问题。
正如你正确观察到的那样,你不会在编译中看到任何问题,因为这不是代码中的任何特殊字符,而只是在windows和linux中的换行符解释之间不匹配。
您有一个包含混合Windows和UNIX行结尾的源文件。虽然UNIX只使用了换行符(有时显示为^ J),但Windows使用了回车+换行符(有时显示为^ M ^ J)。您的编辑器会看到UNIX行并说“这必须是一个UNIX文件”,然后看到分散的Windows行结尾并说“这是一个特殊字符,我必须显示它”。
您可以尝试以某种方式转换文件。您可以尝试使用该命令dos2unix
转换为UNIX行结尾。这将适用于UNIX端,但除非你得到一个知道UNIX结尾的Windows编辑器,否则你的Windows端将会混乱。
或者您可以使用unix2dos
并制作所有Windows。如果您与整个文件保持一致,那么您的UNIX编辑器(通常比Windows编辑知道UNIX结尾更容易知道Windows结尾)应该没问题。这个特定的时间emacs / gvim只是因为文件不一致而感到困惑。
如您所见,编译器不关心行结尾是什么。