有时候我们会在Windows下编写代码,然后再放到Linux下进行编译。此时就会涉及到两个系统对换行符的解释了。不同的解释,就会造成一些奇怪的错误。
1、问题描述
在SourceInsight上查看main()函数,这么一看,没啥毛病。
但是当我将该文件放到Linux上使用gcc进行编译,编译出错,提示第322行出错,但是322行是return 0;没啥毛病啊。
我把321行和322行屏蔽掉,再次编译,同样会出错,出错跟上次不一样。
在Linux系统中打开这个文件,发现有个奇怪的地方,在a test中间有个^M的字符。
这个字符在Linux会被解释成换行,于是上面就等价于:
这就能解释为什么第二次编译会出现那种出错了。在Windows下我们看不出^M的存在,看起来像是个空格,但是在Linux下^M会影响到整个代码的格式,于是有可能会出现错误。
要模拟上述的情况其实很简单。在SourceInsight可以插入一个ASCII字符。
Edit -> Special Edit -> Insert ASCII..
输入0xd的字符就可以出现^M了。
2、Windows/Linux对换行的解释
Windows: 0D0A
Unix\Linux: 0A
MAC: 0D
3、删除^M
使用dos2unix工具,将dos下的文件转换成unix下的文件。
#dos2unix filename