为什么开源的代码没有注释_源代码采用utf8 with bom还是utf8 no bom保存的相关问题...

说出来可能难以致信,源代码采用何种encoding来保存是个难以两全的问题。

仅考虑visual studio,android studio,xcode,gcc,也没有办法达到统一。

首先vs没有配置来直接设置源码文件的默认编码。在中文windows环境下,默认强制为GB2312,只能手工修改单个文件的编码,不胜其烦。

如果某个文件采用GB2312编码,拿到xcode下会显示为乱码。所以看起来应该采用utf8。那是要utf8 bom还是utf8 no bom呢?

utf8 bom看起来不错,但有时还要支持较旧版本的编译器,它们有些甚至直接不认utf8 with bom的文件。

那看来只能选utf8 no bom了。

如果源码中不采用中文,目前没有发现问题。

有时难免在代码中写一些注释,如果用到了中文注释,则有个大坑在等着我们,迟早会遇到。会清晰起见,构造如下最简单的代码来重现此问题

在vs2019中创建console工程

注意采用n换行,utf8 without bom来保存

(为什么这里强调用n来换行呢?因为windows,linux,xcode等一些编辑器的默认换行都可能不同,为了支持多平台,经常在各种不同的编辑器修改保存文件,大概率会遇到在vs中编译以n换行的代码)

//中

编译时报:

warning C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss

error C2065: 'gValue': undeclared identifier

用UltraEdit看到代码,可看到

50187b6f4889dc0fd4836a95b6a7765b.png

"中"的utf8编码为E4 B8 AD

编译报错的可能原因:

由于没有BOM,编译器猜测此文件采用了GB2312

当E4 BB解析为涓

发现AD 0A不是有效的GB2312编码,AD也不是英文字母,所以报warning C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss


然后问题来了,编译器"成功"越过了0A换行,顺带把下一行代码也当作注释了,

即认为int gValue=1;这一行也是注释

然后在main中报error C2065: 'gValue': undeclared identifier

再构造如下场景,在上面的代码注释中再加一个中文字符,比如:

//中文

这次编译正常,不报警告也不报错了

用UltraEdit查看

98d3115f4eb38f1eace724d66dee7237.png

原因:

编译器把"中文"解析为如下3个字符

E4 B8

AD E6

96 87

然后看到换行符0A了

总结如下

源码采用utf8 without bom保存时,如果有中文,则要非常谨慎。

在最好的情况下,代码编译时直接报错,这种问题反倒好查。

在最坏的情况下,有代码行会被当作注释给忽略掉并且仍然编译成功。这个很难排查。

解决办法:

  • 谨慎处理vs warning C4819
  • 设置编辑器统一采用rn换行
  • 注释行后面加一个空行
  • 注释里慎用中文,建议尽量只采用英文注释(较难做到)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值