c++注意点(6)----预处理器
·
在 C 和 C++ 中,# 和 ## 是预处理运算符(也称 “宏运算符”),仅在预处理阶段起作用,用于对宏参数进行字符串化、拼接等操作。它们是宏定义中实现复杂逻辑的重要工具,以下是详细讲解:
1. # 运算符:字符串化(Stringizing)
# 运算符的作用是将宏参数转换为字符串常量(自动添加双引号),也称为 “字符串化”。
#include <stdio.h>
// 定义宏,使用#将参数转换为字符串
#define STR(x) #x
int main() {
printf(STR(hello)); // 等价于 printf("hello");
printf("\n");
printf(STR(123 + 456)); // 等价于 printf("123 + 456");
return 0;
}
结果为 :
hello
123 + 456
2. ## 运算符:令牌拼接(Token Pasting)
## 运算符的作用是将两个令牌(Token)拼接为一个新的令牌,也称为 “令牌粘贴”。
#include <stdio.h>
// 拼接变量名:prefix + num -> prefixnum
#define MAKE_VAR(prefix, num) prefix##num
int main() {
int MAKE_VAR(val, 1) = 10; // 等价于 int val1 = 10;
int MAKE_VAR(val, 2) = 20; // 等价于 int val2 = 20;
printf("%d %d\n", val1, val2); // 输出 10 20
return 0;
}
- 嵌套宏的处理:若参数是宏,## 会先展开内层宏,再拼接。
#define PREFIX val
#define NUM 3
#define MAKE_VAR(p, n) p##n
int MAKE_VAR(PREFIX, NUM) = 30; // 先展开为 val##3,再拼接为 val3
- 不能用于开头或结尾:## 必须左右都有令牌,例如 ##a 或 a## 是错误的。
更多推荐


所有评论(0)