【C++】报错:multi-line comment

1、C/C++中的注释

在C/C++语言中,在对源文件做预处理的时候,有两条基本原则:

  • 凡是以"//"开头的为单行注释
  • 凡是以"\"结尾的代表此行尚未结束

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

2、文本编码问题

对于big5中的汉字而言,其第一个字节的编码范围是0xA1 - 0xFE,第二个字节是0×40 -0xFE。

而''的ASCII码是0×5c.这就意味这,凡是以big5编码的文件,如果gcc没有正确的认为它源文件的编码是big5,那么就可能出现因为单行注释末尾是汉字,而把下行的代码吃掉的情况。

这样是很危险的,但是gcc会给出一个警告:"warning: multi-line comment In file"

这样的问题在gbk中同样存在。

将下面的代码

cpp 复制代码
//你篭
int main(int argc,char* argv[]){
return 0;
}

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

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

bash 复制代码
$ gcc -c testgbk.cpp
testgbk.cpp:5: error: expected unqualified-id before "return"
testgbk.cpp:6: error: expected declaration before '}' token

原因很简单,我把"好"字的GBK编码的后半个字节改成了''的编码,从而得到了"篭"字。gcc发现''后面接着的就是'\n',故而把下一行"int main(int argc,char* argv[]){"也当做注释一并删除掉了。

3、解决方法

3.1 方法一

强行给gcc添加-finput-charset=big5这样的参数,来解决此问题。

类似的还有-fexec-charset,-fwide-exec-charset用于指定执行环境的编码。

但是,gcc内部的处理都是基于utf-8的,且其转换工作一般是靠系统的iconv转码库来完成的。 所以系统库必须提供 GBK<-> UTF-8 、BIG5 <-> UTF-8 的编码.

例如,使用 -finput-charset=big5 参数来编译一个测试文件:

bash 复制代码
$ gcc -c testbig5.cpp -finput-charset=big5 -fexec-charset=big5 -fwide-exec-charset=big5

所得到的输出是:

bash 复制代码
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

所以这种方案的缺点是:

  • 缺乏通用性,缺乏可移植性,一般系统的iconv转码功能差
  • 添加了很多额外的转码操作。
    目前,utf-8(unicode)尚未完全容纳GBK、big5的全部字符。很多字符是转换不过去的。

3.2 方法二

保证每行注释都以句号或者空格结尾。

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

例如:

cpp 复制代码
const char* s="你篭";

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

cpp 复制代码
const char* s="你篭"";

3.3 方法三

较好的解决方案是源文件都以UTF-8格式编码。这样可以最大限度的减少转码次数。

3.4 方法四

最彻底的解决方案是引入gettext,不在源文件中存储汉字的常量字符串。改用单独的文件存储。

目前包括很多php论坛、blog都已采用这种方案。但是这样做本来是为了支持英、法、汉多语言,解决翻译的问题。如果单为了简、繁的问题就这么做,代价太大。

原文链接:https://blog.csdn.net/lyd0813/article/details/83023918

相关推荐
云泽80820 分钟前
C/C++内存管理详解:从基础原理到自定义内存池原理
java·c语言·c++
小年糕是糕手1 小时前
【数据结构】双向链表“0”基础知识讲解 + 实战演练
c语言·开发语言·数据结构·c++·学习·算法·链表
将车2441 小时前
C++实现二叉树搜索树
开发语言·数据结构·c++·笔记·学习
Dream it possible!2 小时前
LeetCode 面试经典 150_栈_简化路径(53_71_C++_中等)(栈+stringstream)
c++·leetcode·面试·
爱和冰阔落2 小时前
【C++继承下】继承与友元 / static 菱形继承与虚继承 组合的详解分析
c++·面试·腾讯云ai代码助手
草莓熊Lotso3 小时前
《C++ Stack 与 Queue 完全使用指南:基础操作 + 经典场景 + 实战习题》
开发语言·c++·算法
敲上瘾3 小时前
单序列和双序列问题——动态规划
c++·算法·动态规划
ajassi20003 小时前
开源 C++ QT QML 开发(二十二)多媒体--ffmpeg编码和录像
c++·qt·开源
小糖学代码5 小时前
Linux:11.线程概念与控制
linux·服务器·c语言·开发语言·c++
Larry_Yanan8 小时前
QML学习笔记(四十)QML的ApplicationWindow和StackView
c++·笔记·qt·学习·ui