liye

liye

博客园 首页 新随笔 联系 订阅 管理

http://topic.csdn.net/u/20100325/22/46C67761-38C8-4505-90BD-7C118791A298.html


---------------------------------------------------------------------------------------------------------------------------------------------


最近遇到一个奇怪的问题,代码中的中文注释能使程序出错!!!
试看如下的代码:
int main() {
int a = 0;
int b = 0;

/**停车来源字*/
a = 10;
b = 20;

/**注释结束*/
printf("a=%d\tb=%d", a, b);

return 0;
}
运行的结果居然是:a=0 b=0
分析后发现中间的赋值语句被当成了注释,忽略掉了。
请问各位大虾,是否遇到此现象?怎么解释?怎么避免此现象?
编译环境是VC++6.0。


---------------------------------------------------------------------------------------------------------------------------------------------


从规律来看,出现问题的条件:
1.注释是中文,用英文则没有问题
2.用/**/,用//无问题
3./*之后还有*,而*/前没有*
所以你保持中文注释前后的*数量相等就没有问题。哈哈



这应该是在多字节编码方式下分析字符出现的问题
首先需要明确的是:Cpp文件是无法指定编码方式的,因此为了知道编码方式,编译器只能采取一种“猜测”算法,也就是看给定的文本中,这个字符最佳匹配到那种编码,就认为它是最佳匹配。

对于楼主给出的文字,我估计其二进制字节序列既可以解释为GB2312你看到的这个字符串,同时也可以解释为其他编码中的字符串,而在那个编码方式中,匹配后正好把序列中的*或者/吃掉了,导致注释被曲解。

这不是bug,这是在无法指明编码方式下的不可避免的问题,编译器只能采用“最佳猜测”的方法进行判断(这在google mail中也是这样的,没有编码的邮件只有猜测)。

建议楼主避免使用中文做注释,如果注释的话,在中文前后都加至少2个空格(不是tab),避免内容被曲解



以前曾经说过
“停”字编码有点问题

新建记事本,输入 “停” 字,保存关闭,重新打开,就会乱码


其实就是编码识别问题,在记事本里写“联通”保存后再打开也是显示不了。
可以试试用UltraEdit等二进制编辑软件在文件前面添加FF FE然后再试试。


“停”字的Unicode码0x505C,GBK码0xCDA3,UTF8码0xE5819C
注意其Unicode码0x505C如果当ASCII码来解释就是P\

而\既是C语言的转义符,又是C语言的续行符!

估计这才是把编译器搞晕的根本原因。

不过话说回来,这个世界上现在还不存在没有Bug的编译器,估计将来也不会有。
我们所能做的就是想办法绕过这些编译器Bug导致问题。


/* */是C语言的注释写法,C++就应该用//,才是标准的。
干脆制定公司编程规范,代码中不得使用/* */。

posted on 2010-03-26 11:33    阅读(1015)  评论(0编辑  收藏  举报