C++学习,# 和 ## 运算符
C++中,#
和 ##
是两个特殊的预处理运算符,它们主要在宏定义中使用,用于字符串化和标记粘贴(token pasting)操作。
#
运算符:字符串化
#
运算符用于将其后的宏参数转换为一个字符串常量。如果宏参数是一个宏标识符,则它会被转换成用双引号括起来的该标识符的字符串表示。这个操作在需要将宏参数作为字符串处理时非常有用。
示例:
#define STRINGIFY(x) #x
int main() {
const char* str = STRINGIFY(hello world); // str 将会是 "hello world"
return 0;
}
##
运算符:标记粘贴
##
运算符用于在宏扩展时连接两个标记(token)。如果两个宏参数之间放置了 ##
运算符,那么这两个参数在宏扩展时会被合并成一个标记。这个操作在需要根据宏参数动态生成标识符时非常有用。
示例:
#include <iostream>
using namespace std;
#define concat(a, b) a ## b
int main()
{
int xy = 100;
cout << concat(x, y);
return 0;
}
注意事项
#
和##
运算符只能在宏定义中使用。- 使用
##
运算符时,如果任一操作数在宏扩展后为空,则行为是未定义的。 #
运算符生成的字符串不包括任何周围的引号,但它确实会生成一个字符串字面量。- 这两个运算符是预处理指令的一部分,它们在编译之前由预处理器处理。