C语言宏

在 C 语言中,宏(Macro)是一种预处理指令,用于在编译前对源代码进行文本替换。

宏由预处理指令 #define 定义,分为两种类型:

  • 对象式宏(Object-like Macro):无参数的简单文本替换。
  • 函数式宏(Function-like Macro):带参数的类似函数调用的宏。

对象式宏

#define 标识符 替换文本

1
2
3
#define PI 3.14159 // 定义常量(如 PI、MAX_SIZE)。
#define MAX_SIZE 100
#define DEBUG // 条件编译(如 #ifdef DEBUG)。

函数式宏

#define 宏名(参数列表) 替换文本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 简单函数式宏
#define SQUARE(x) ((x) * (x))
#define MAX(a, b) ((a) > (b) ? (a) : (b))

// 多行宏(用反斜杠 \ 连接)
#define SWAP(a, b) \
do { \
typeof(a) temp = (a); \
(a) = (b); \
(b) = temp; \
} while (0)

int main() {
int x = 5;
int y = 10;

printf("Square: %d\n", SQUARE(x)); // 展开为 ((x) * (x))
printf("Max: %d\n", MAX(x, y)); // 展开为 ((x) > (y) ? (x) : (y))

SWAP(x, y); // 展开为一个 do-while 语句
printf("Swapped: x=%d, y=%d\n", x, y); // 输出: x=10, y=5

return 0;
}

注意事项

括号保护:参数和整个表达式都应加括号,避免运算符优先级问题。

1
2
#define ADD(a, b) a + b  // ADD(2, 3) * 4 会展开为 2 + 3 * 4 = 14
#define ADD(a, b) ((a) + (b)) // 展开为 ((2) + (3)) * 4 = 20

参数不计算:宏参数是纯文本替换,不会提前求值

预处理器操作符###

操作符(字符串化)

将宏参数转换为字符串常量,参数会被直接转换为字符串,不会进行表达式求值或变量替换;如果参数本身是字符串,会自动添加额外的引号(例如 “abc” 会变成 “\”abc\””)。

1
2
3
4
5
6
7
#define PRINT(x) printf(#x " = %d\n", x)

int main() {
int num = 42;
PRINT(num); // 展开为 printf("num" " = %d\n", num);
return 0;
}

使用 gcc -e 指令查看预宏展开后的文件如下

1
2
3
4
5
6
# 5 "c_define.c"
int main () {
int x = 10;
printf("x" " = %d\n", x);
return 0;
}

操作符(记号链接)

## 操作符用于将两个预处理记号(token)连接成一个新的记号。它可以在宏定义的参数列表或替换文本中使用。

1
2
3
4
5
6
7
8
9
#include <stdio.h>

#define CONCAT(a, b) a##b

int main() {
int num10 = 100;
printf("Value: %d\n", CONCAT(num, 10)); // 等价于 printf("%d", num10);
return 0;
}

defineconst

#defineconst 都可用于定义常量,但它们的实现机制、作用域和使用场景有本质区别。
img

条件编译

宏定义也可以用于条件编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifdef DEBUG
#define LOG(msg) printf("[DEBUG] %s\n", msg)
#else
#define LOG(msg) // 空定义,忽略日志
#endif

// 检查系统平台
#ifdef __linux__
#define PLATFORM "Linux"
#elif defined(_WIN32)
#define PLATFORM "Windows"
#else
#define PLATFORM "Unknown"
#endif


C语言宏
https://1zqqx.github.io/2025/05/10/C语言宏/
作者
1zqqx
发布于
2025年5月10日
许可协议