在 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## 是错误的。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐