C 将语句分隔符更改为其他内容;用#定义

C 将语句分隔符更改为其他内容;用#定义,c,c-preprocessor,C,C Preprocessor,我使用#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

我使用#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
:在函数“main”中:
:11:22:错误:通用字符\U00003002在标识符中无效
:11:22:错误:应为“,”或“;”在“.”之前
:12:21:错误:通用字符\U00003002在标识符中无效
:14:1:错误:输入结束时需要声明或语句

但是,当我将“是”定义为;,它起作用。

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

表单的预处理指令

定义标识符替换列表新行

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

第6.4.2.1节:

语法

标识符:

非数字标识符

非数字标识符

标识符数字

非数字标识符:

非数字

通用字符名

其他实现定义的字符

非数字:其中之一 _a b c d e f g h i j k l m n o p q r s t u v w x y z a b c d e f h i j l m n o p q r s t u v w x y z

数字:其中一位 013456789

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

根据标准,您不可能执行您试图执行的操作,因为标识符不能包含中文句号字符(无论采用何种编码)


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

嗯,
通用字符\U00003002在标识符中无效。
。CPP使用UTF-8而不是UTF-16。将您的文件编码更改为utf-8使用c预处理器进行实验…一个有趣的实验,但它永远不会起作用。预处理器用于替换看起来像标识符的东西,而不是任意的标点符号。你说的“看起来像标识符”是什么意思?可以跳过
#define
并使用
tr.;”source.c
作为shell中的预处理器步骤:未测试。如果我编辑GCC源代码,它会工作吗?如果是,那是什么文件?你可以签出。破解编译器来做你想做的是浪费时间。您的代码将无法移植到任何其他编译器,而且您将永远必须将上游更改合并到gcc以保持fork的最新状态。最好是学习用定义的语言编程。@paulJ.Lucas如果你在编程过程中学到了一些东西,那就不是浪费时间。