最近有人给我发了几个.cpp
源代码文件。当我用 GNU Emacs 或 GVIM 打开这些文件时,我发现^M
每行末尾都有一个奇怪的字符。
下面是一个屏幕截图,显示了我的意思
当我使用 Gedit 打开这些相同的源文件时,我看不到这些^M
字符。我该怎么办?这里有很多文件有问题,因此打开并通过用空字符串替换来执行搜索替换操作看起来是一项艰巨的操作。
奇怪的是,当我使用 GCC 编译时,这些文件可以顺利编译。这是怎么回事?我该怎么办?
答案1
在 Unix 中,换行符是\n
,而在 Windows 中则是\r\n
.\r
或者^M
是回车符。
如果文件是在 Windows 模式下的编辑器中编写的,则每个换行符都会带有一个回车符。如果您告诉编辑器(并且编辑器能够理解)将换行符视为 Windows 中的字符,那么您将不再看到这些^M
字符。
或者,您可以dos2unix
在代码库上运行来修复此问题。
正如您正确观察到的那样,您不会在编译中看到任何问题,因为这不是代码中的任何额外特殊字符,而只是 Windows 和 Linux 中的换行符解释不匹配。
答案2
您的源文件中混合了 Windows 和 UNIX 行尾。UNIX 只使用换行符(有时显示为 ^J),而 Windows 使用回车符 + 换行符(有时显示为 ^M^J)。您的编辑器看到 UNIX 行后会说“这肯定是 UNIX 文件”,但看到零散的 Windows 行尾后会说“这是一个特殊字符,我必须显示它”。
您可以尝试以某种方式转换文件。您可以尝试使用命令dos2unix
转换为 UNIX 行尾。这在 UNIX 端有效,但 Windows 端会感到困惑,除非您使用知道 UNIX 行尾的 Windows 编辑器。
或者您可以使用unix2dos
并使其全部为 Windows。如果您对整个文件保持一致,您的 UNIX 编辑器(它们对 Windows 结尾的了解往往比 Windows 编辑器对 UNIX 结尾的了解更深入)应该没问题。这次 emacs/gvim 只是因为文件不一致而感到困惑。
正如您所见,编译器并不关心行尾是什么。
答案3
Source insight -> 选项 -> 首选项 -> “文件”选项卡 -> 在默认文件格式菜单中设置“Unix(LF)”。
答案4
您在 emacs/vim 中看到这些的原因在于它们读取事物的方式/事物的编码方式。实际上^M
只是一个Carriage Return
(按下回车键)。
无论如何,您可以尝试执行(在 vim 中,因为我不知道 Emacs 中的适当命令):set ff=unix
,然后:w
将其转换为 Unix 格式并在下次打开时将其删除(iirc)。
或者,如果您想要^M
从文档中明确删除,请使用 进行搜索/替换(在 Vim 中,因为我只知道这一点):%s/<ctrl + v><ctrl + m>//gc
。
(此链接向您展示如何在 Emacs 中执行退货 S/R 的命令。)