在C语言的预处理器(preprocessor)中,##
是一个连接符(concatenation operator),也被称为“粘贴”或“尖括号-井号”运算符。它主要在宏定义和条件编译中使用,用于连接两个标记(tokens)。
这里有一些使用##
的例子:
-
在宏定义中连接标记:
c复制代码
#define CONCAT(a, b) a ## b | |
int main() { | |
int xy = 5; | |
int CONCAT(x, y) = 10; // 这等同于 int xy = 10; | |
return 0; | |
} |
-
在条件编译中删除标记:
c复制代码
#define ENABLE_FEATURE 1 | |
#if ENABLE_FEATURE | |
#define FEATURE_CODE | |
#else | |
#define FEATURE_CODE ## | |
#endif | |
FEATURE_CODE int feature_var = 0; // 如果ENABLE_FEATURE为1,则定义int feature_var; 否则什么都不做 |
在上述第二个例子中,如果ENABLE_FEATURE
为0,FEATURE_CODE
会被扩展为##
,这意味着##
会“吃掉”它后面的标记(在这种情况下是int feature_var
),从而不定义该变量。如果ENABLE_FEATURE
为1,FEATURE_CODE
会被扩展为空,因此会正常定义feature_var
。
需要注意的是,##
运算符只能连接标记,而不能连接字符串字面量或其他非标记实体。此外,使用##
时要小心,确保在宏展开后不会产生无效的C代码。