首页 > 解决方案 > 将语句分隔符更改为 ; 以外的其他内容 用#define

问题描述

我使用#define 来定义中文句点。作为分隔符:

#define 。 ;

执行以下代码时会出错:

main() {
int i = 0 。
return i 。
}

错误:

<stdin>: In function ‘main’:
<stdin>:11:22: error: universal character \U00003002 is not valid in an identifier
<stdin>:11:22: error: expected ‘,’ or ‘;’ before ‘。’
<stdin>:12:21: error: universal character \U00003002 is not valid in an identifier
<stdin>:14:1: error: expected declaration or statement at end of input

但是,当我将“是”定义为 ; 时,它可以工作。

标签: cc-preprocessor

解决方案


来自关于宏替换的 C11 标准第 6.10.3 节:

形式的预处理指令

定义标识符替换列表换行

定义了一个类似对象的宏,它导致宏名称 171) 的每个后续实例被构成指令其余部分的预处理标记的替换列表替换。然后重新扫描替换列表以获取更多宏名称,如下所示。

在第 6.4.2.1 节:

句法

标识符:

非数字标识符

标识符标识符非数字

识别码

标识符非数字:

非数字

通用字符名称

其他实现定义的字符

非数字:_abcdefghijklmnopqrstu vwxyz ABCDEFGHIJKLMNOPQRSTU VWXYZ 之一

数字:0 1 3 4 5 6 7 8 9 之一

请注意,上面提到的通用字符名称是转义序列,而不是 UTF-8 或 UTF-16 序列的实际字符。

根据标准做你想做的事情是不可能的,因为标识符不能包含中文句点字符(不管它是什么编码。)

您可以尝试使用与 cpp 不同的预处理器。您必须找到一个允许该字符作为文本替换键的字符(缺点是您丢失了所有其他 cpp 指令。)我不知道任何允许这样做的。例如,M4 对标识符中的字符集有相同的限制。


推荐阅读