一、宏定义的简单方式
1、基本使用
#include <stdio.h>
#define PRINT_WELCOME() printf("Hello, welcome!\n");
int main() {
PRINT_WELCOME();
return 0;
}
Hello, welcome!
2、分号的影响
- 宏定义时有分号,调用时也加分号,就会多一个空语句
#define PRINT_WELCOME() printf("Hello, welcome!\n");
PRINT_WELCOME();
- 宏定义时有分号,调用时可以不加分号,但这会导致代码风格不一致,不推荐这样做
#define PRINT_WELCOME() printf("Hello, welcome!\n")
PRINT_WELCOME()
- 宏定义时没有分号,调用时必须加分号
#define PRINT_WELCOME() printf("Hello, welcome!\n")
PRINT_WELCOME();
- 宏定义时没有分号,调用时不加分号,会导致编译错误
#include <stdio.h>
#define PRINT_WELCOME() printf("Hello, welcome!\n")
int main() {
PRINT_WELCOME()
return 0;
}
# 输出结果
E0065 应输入“;”
C2143 语法错误: 缺少“;”(在“return”的前面)
3、在控制语句中可能导致编译错误
- 例如,省略括号的
if-else
语句,它只能控制紧随的一条语句,如果宏展开后变成多条语句,就会导致编译错误
- 宏定义时有分号,调用时也加分号,宏展开后变成多条语句,会导致编译错误
#include <stdio.h>
#define PRINT_WELCOME() printf("Hello, welcome!\n");
int main() {
if (1)
PRINT_WELCOME();
else
printf("do else\n");
return 0;
}
# 输出结果
E0127 应输入一个语句
C2181 没有匹配 if 的非法 else
- 宏定义时有分号,调用时不加分号,宏展开后变成一条语句,不会导致编译错误,但这会导致代码风格不一致,不推荐这样做
#define PRINT_WELCOME() printf("Hello, welcome!\n");
if (1)
PRINT_WELCOME()
else
printf("do else\n");
- 多条语句宏,宏展开后变成多条语句,会导致编译错误
#include <stdio.h>
#define PRINT_WELCOME() printf("Hello, welcome 1\n"); printf("Hello, welcome 1\n")
int main() {
if (1)
PRINT_WELCOME();
else
printf("do else\n");
return 0;
}
# 输出结果
E0127 应输入一个语句
C2181 没有匹配 if 的非法 else
二、宏定义的 do-while(0)
方式
1、基本使用
#include <stdio.h>
#define PRINT_WELCOME() do { printf("Hello, welcome!\n"); } while(0)
int main() {
PRINT_WELCOME();
return 0;
}
# 输出结果
Hello, welcome!\n
2、关于分号
- 宏定义时没有分号,使用时,会强制要求加分号,更像普通函数调用,代码风格保持一致
#define PRINT_WELCOME() do { printf("Hello, welcome!\n"); } while(0)
PRINT_WELCOME();
3、在控制语句中安全使用
- 由于
do-while(0)
方式可以将多条语句组合成一个逻辑块, 例如,在省略括号的 if-else
语句,可以安全使用
- 一条语句
#include <stdio.h>
#define PRINT_WELCOME() do { printf("Hello, welcome!\n"); } while(0)
int main() {
if (1)
PRINT_WELCOME();
else
printf("do else\n");
return 0;
}
# 输出结果
Hello, welcome!
- 多条语句
#include <stdio.h>
#define PRINT_WELCOME() do { printf("Hello, welcome 1\n"); printf("Hello, welcome 2\n"); } while(0)
int main() {
if (1)
PRINT_WELCOME();
else
printf("do else\n");
return 0;
}
# 输出结果
Hello, welcome 1
Hello, welcome 2