中文注释引起代码执行错误! --转
2010-03-26 11:33
253 查看
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++就应该用//,才是标准的。
干脆制定公司编程规范,代码中不得使用/* */。
---------------------------------------------------------------------------------------------------------------------------------------------
最近遇到一个奇怪的问题,代码中的中文注释能使程序出错!!!
试看如下的代码:
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++就应该用//,才是标准的。
干脆制定公司编程规范,代码中不得使用/* */。
相关文章推荐
- mysql代码里面有中文注释导致语法错误
- 有时候,Visual C++代码中加中文注释会导致错误!
- VC中,中文注释引起的错误
- js中包含中文注释引起的错误
- 有时候,Visual C++代码中加中文注释会导致错误!
- AS 中 代码中的中文注释可能会引起Gradle报错
- 小心注释掉的js代码也会引起错误
- android studio :代码中的中文注释可能会引起Gradle报乱码
- visual studio c# 查找代码中含有中文的行 要求该行非注释、非#region
- “不能执行已释放的Script代码”错误的原因及解决办法
- JavaScript出现“不能执行已释放的Script代码”错误的原因及解决办法
- 写C++代码遇到的一个问题,错误已经在代码中注释了
- 代码访问 SQL Server数据库时的错误: 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作
- HTML代码中标签的全部属性 中文注释说明
- XML 配置文件注释引起错误及解决方案
- 在Linux中#!/usr/bin/python之后把后面的代码当成程序来执行。 但是在windows中用IDLE编程的话#后面的都是注释,之后的代码都被当成文本了。 该怎么样才能解决这个问题呢?
- Sap2000官方API文档中的C#示例(已修改原有错误并加中文注释)
- latex 中,代码注释含有中文和英文,英文会跑后面的问题。
- 一种奇怪的错误,执行一个junit测试用例,代码却执行了很多遍
- MyBatis代码实例系列-08:MyBatisGenerator插件及扩展(中文注释和Mapper重命名为Dao)