我正在使用#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
但是,当我将'yes'定义为;时,它会起作用。
答案 0 :(得分:1)
有关宏替换的C11标准第6.10.3节:
形式的预处理指令
定义标识符替换列表换行符
定义了一个类似于对象的宏,该宏导致每个后续的宏名称171)实例都被构成令牌的预处理令牌的替换列表替换。 指令的其余部分。然后重新扫描替换列表以获取更多的宏名称 如下所述。
这里是第6.4.2.1节:
语法
标识符:
标识符非数字
标识符非数字标识符
标识符位数
标识符非数字:
非数字
通用字符名称
其他实现定义的字符
非数字:其中之一 _ a b c d f g h i j k l m n o p q r s t u v w xy z 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
位数:以下之一 0 1 3 4 5 6 7 8 9
请注意,上述通用字符名称是转义序列,而不是UTF-8或UTF-16序列的实际字符。
无法按照标准执行您要执行的操作,因为标识符不能包含中文句点字符(无论其采用哪种编码。)
您可以尝试使用与cpp不同的预处理器。您将必须找到一个允许该字符作为文本替换键的字符(缺点是您丢失了所有其他cpp指令。)我不知道有什么允许该字符。例如,M4对标识符中的字符集有相同的限制。