什么可以用作 C/C++ 中 #define 指令的标识符

What can be used as an identifier for a #define directive in C/C++

我很好奇什么可以用作 C and/or C++ 中 #define 指令的标识符。每个字符串令牌都合法吗?

例如,下面的代码可以编译吗?

#define EMPTY ;;

for(EMPTY){
  function();
}

规则与其他标识符大致相同。一些名称(例如,带有前导下划线后跟另一个下划线或大写字母的名称)保留用于实现。在 C++ 中,带有两个连续下划线(任何地方,不仅仅是开头)的名称也被保留。

C++(但不是 C)中的 #define 还有一个特定的附加条件:不允许重新定义保留字。所以像 EMPTY 这样的名字是可以的,但是像 forauto 这样的名字就不行了。

变量名、函数名、goto 标签等常规标识符的句法规则与预处理器指令中使用的标识符相同。

C 标准对单词标识符有一个精确和唯一的定义,所以无论单词标识符出现在标准中的什么地方,都是一样的东西。