目录
一、定义一个标准宏
#define MAX_LEN 10
- 允许留有空格,但请不要写成下面这样,这看着很不舒服
- 宏的名字建议全部大写,单词与单词之间用 _ 连接,这是一个很好的规范
- 最后不要加分号
二、带未知数的宏定义
# define SUM(x) (x)+(x)
int main()
{
printf("%d\n", SUM(10));
printf("SUM(20)\n");
return 0;
}
编译器会将SUM(x),进行简单的宏替换,不会自动给加括号等 !!!
还是用上面的宏,这个结果会是什么呢
printf("%d\n", SUM(10)*2); // 输出30 替换为10+10*2
三、宏在哪里可以定义
结论:并非要在开头,哪里都可以定义宏,无论是函数里,函数外,代码快里等等
#define OUT_DEF 10
int main() {
#define IN_DEF 20
printf("%d %d", OUT_DEF, IN_DEF);
return 0;
}
四、何时进行宏替换
一份C语言代码变为可执行程序的四个步骤
- 预处理:去注释、宏替换、条件编译 (去注释先于宏替换)
- 编译:将C语言转为汇编语言
- 汇编:汇编语言转为二进制文件(不可被执行)
- 链接:自身文件与库文件关联,形成可执行程序
不要企图用宏充当注释,因为去注释先于宏替换,相当于你定义了一个为空的宏
#define NO_EXE //
五、宏的有效范围
结论:从宏定义处开始,只对他下面的代码起作用
因为函数调用是在编译时进行的而宏替换是在预处理阶段
当宏替换时还没解释show函数,编译器编译时不认识M
六、宏定义多语句
结论:用do{}while(0)封装。为什么呢?
#define INTI_RECT_VALUE(a, b) \
do{\
printf("before:%d %d\n", a, b);\
a=0;\
b=0;\
printf("after:%d %d\n", a, b);\
}while(0)1.该宏在if,while结构中,只有一条语句,没加{ },报错
2.加了{ },最后会多一个分号,报错
当然现在的编译器都很强大可能给你自动优化
七、undefine取消宏
#define NUM 10
#undefine NUM
看题:
//程序输出结果
#define X 10
#define Y X+10
#undef X
#define X 20
int main() {
int x = Y;
printf("%d\n", x);
return 0;
}
// 输出30
宏就是简单的替换,Y替换为X+10,X替换为20
八、宏中的# 与 ##
结论:
#可将s里的内容转为字符串
##用于构建新符号
看两段代码
#define STR(s) #s //将s的内容替换为字符串
int main()
{
printf("Pi:"STR(3.14)"\n");
return 0;
}
#define TOSTRING(s) #s
int main()
{
int a = 124;
char *s = TOSTRING(a);
printf(s); // 输出a
return 0;
}
代码一输出字符串“3.14”,代码二输出字符‘a’ 宏替换先于编译
## 构建新符号
#define XNAME(n) student##n
int main() {
XNAME(1); //替换为student1;
return 0;
}
九、条件编译
#ifdef 与 #if
- #ifdef:检查宏是否被定义
- #if:检查宏的结果是真是假
- 条件编译用于裁剪代码,降低维护成本,例如一个软件企业版与社区版
1. #ifdef …… #else……#endif (不常用)
//条件编译 #ifdef检查宏是否被定义
//这叫定义
#define M
int main()
{
#ifdef M
printf("M is define\n");
#else
printf("M is not define\n");
#endif
return 0;
}
2. #if……#else……#endif (常用)
不定义走else,不赋值报错
#define M 1
int main()
{
#if M
printf("M is true define\n");
#else
printf("M is false define\n");
#endif
return 0;
}
- #ifdef可以被#if define()替换
- #ifndef可以被#if !define()替换
- 支持多条件判定
#define C
#define CPP
int main()
{
#if (defined(C) && defined(CPP))
printf("C and CPP\n");
#else
printf("other\n");
#endif
return 0;
}
支持嵌套
#define C
#define CPP
int main()
{
#if defined(C)
#if defined(CPP)
printf("CPP\n");
#endif
printf("C\n");
#else
printf("other\n");
#endif
return 0;
}
欢迎大家指正!!!