• 中文注释引起代码执行错误! 转


    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++就应该用//,才是标准的。
    干脆制定公司编程规范,代码中不得使用/* */。

  • 相关阅读:
    大话设计模式笔记(十三)の状态模式
    大话设计模式笔记(十二)の抽象工厂模式
    大话设计模式笔记(十一)の观察者模式
    大话设计模式笔记(十)の建造者模式
    大话设计模式笔记(九)の外观模式
    大话设计模式笔记(八)の模板方法模式
    大话设计模式笔记(七)の原型模式
    Vue(十二):自定义指令和函数渲染
    Vue(十一):组件边界
    Vue(十):混入、插件和过滤器
  • 原文地址:https://www.cnblogs.com/liye/p/1696854.html
Copyright © 2020-2023  润新知