将语句定界符更改为除;以外的其他值;与#define

时间:2018-09-22 12:41:23

标签: 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 ‘,’ 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'定义为;时,它会起作用。

1 个答案:

答案 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对标识符中的字符集有相同的限制。