^M导致的编译出错

有时候我们会在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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值