C语言英语注释,C语言的注释

在C/C++语言中,

在对源文件做预处理的时候,有两条基本原则:

1、凡是以//开头的为单行注释

2、凡是以\结尾的代表此行尚未结束

于是预处理器在处理的时候会先按第二条规则,看每行的末尾的那个 字符是不是”\”,是的话,就下一行接到本行。然后把所有 以//开头的注释和 /* */的块注释去掉。

但是存在一个问题,入下:

对于big5中的汉字而言,其第一个字节的编码范围是0xA1 - 0xFE,第二个字节是0x40 - 0xFE。而’\'的ASCII码是0x5c,这就意味着:凡是以big5编码的文件,如果gcc没有正确的认为它的 源文件的编码是big5,那么就可能出现因为 单行注释末尾是汉字,而把下行的代码吃掉的情况。这样是很危险的,但是gcc会给出一个警告:”warning: multi-line comment In file”。这样的问题在gbk中同样存在。

将下面的代码

// 你好\

int main(int argc, char* argv[])

{

return 0;

}

以gbk的方式保存,并采用gcc 3.4编译。

无论是solaris 8还是freebsd 6.2,无论shell的locale的设置是 zh_CN.GBK还是 zh_CN.UTF-8,所得到的错误都是相同的。

$ gcc -c testgbk.cpp

testgbk.cpp:5: error: expected unqualified-id before “return”

testgbk.cpp:6: error: expected declaration before ‘}’ token

g++ 3.3下显示:

testgbk.cpp:3: error: parse error before `return’

截图如下:

926f43571edf6e1f2960f41cc07dafb4.png

原因很简单,我把“好”字的GBK编码的后 半个 (?)字节改成了’\'的编码,从而得到了”篭”字。

gcc发现’\'后面接着的就是’\n’,故而把下一行”int main(int argc, char* argv[])”也当做注释一并删除掉了。按gcc 3.4的man页,gcc会根据shell的locale设置来 猜测 源文件的编码格式,否则它会把其当作utf-8来处理。但是据我在Freebsd和solaris系统中的观察,gcc 3.4并没有根据 环境变量来猜测源文件的编码。

一个不错的解决方案是:强行给gcc添加-finput-charset=big5这样的参数,来解决此问题。类似的还有-fexec-charset,-fwide-exec-charset用于指定执行环境的编码。但是不幸的是,gcc内部的处理都是基于utf-8的,且其转换工作一般是靠系统的iconv转码库来完成的。 所以系统库必须提供 GBK UTF-8 、BIG5 UTF-8 的编码。

例如,我在Freebsd 6.2下使用这样的参数编译一个测试文件:

$ gcc -c testbig5.cpp -finput-charset=big5 -fexec-charset=big5 -fwide-exec-charset=big5

所得到的输出是:

cc1plus: no iconv implementation, cannot convert from big5 to UTF-8

cc1plus: no iconv implementation, cannot convert from UTF-8 to big5

cc1plus: no iconv implementation, cannot convert from UTF-8 to big5

所以这种方案的缺点是:

1、缺乏通用性,缺乏可移植性。

Freebsd的内核中的转码是靠查一个16位的表,所以无法处理utf-8中的汉字(因为汉字是3字节),而直到最新的,要到08才能发布的Freebsd 7.x,此问题也依然没有被解决。而Solaris最初的代码是基于BSD的。它所提供的iconv转码功能也非常差。

2、添加了很多额外的转码操作。

目前,utf-8(unicode)尚未完全容纳GBK、big5的全部字符。很多字符是转换不过去的。

另一个折衷的方案是:保证每行注释都以句号或者空格结尾。

缺点是,需要检查并改动很多文件。而且,特殊汉字依然有可能出现在源文件的常量字符串中。问题依旧。

例如:

const char* s=”你篭”;

写成这样的怪样子就可以编译了:

const char* s=”你篭”";

较好的解决方案是源文件都以UTF-8格式编码。这样可以最大限度的减少转码次数。最彻底的解决方案是引入gettext,不在源文件中存储汉字的常量字符串。改用单独的文件存储。目前包括很多php论坛、blog都已采用这种方案。但是这样做本来是为了支持英、法、汉多语言,解决翻译的问题。如果单为了简、繁的问题就这么做,代价太大。

来源:oschina

链接:https://my.oschina.net/u/614348/blog/634138

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值