c - 将语句分隔符更改为 ; 以外的其他内容 用#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
但是,当我将“是”定义为 ; 时,它可以工作。
解决方案
来自关于宏替换的 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 对标识符中的字符集有相同的限制。
推荐阅读
- javascript - 使用状态变量重新渲染 React 表单时出错
- r - 如何在保持单元格顺序的同时从上到下更改ggplot中一个类别的位置?
- python - 作为行级函数的参数传递的 pandas 数据框列,以将列的每个值应用于其各自的行
- three.js - 字符导向ThreeJS
- python - Python,使用多线程退出带有用户输入的 While 循环(cntrl+c 不起作用)
- python - 计算并保存具有日期的列之间的差异
- node.js - 如何从 LoopBack 模型文件生成 ERD
- c++ - 创建具有独特功能但数据类型相同的对象
- oracle - 杀死 dba_jobs_running 中的 oracle 作业
- twitter-bootstrap - Bootstrap 3 modal 从页脚开始,就像 Badoo 上的一样