字符串宏常量
如何定义? 这样做是不行的!!!
宏定义代表字符串的时候一定要加上双引号!!!
程序翻译为二进制代码的过程
为什么把文本代码翻译成二进制代码呢?
因为计算机只认识二进制,所以我们要把文本代码经编译器翻译为二进制代码 预处理-E :头文件展开,去注释,宏替换 条件编译 编译-S : 将干净的C语言,编译成为汇编语言 汇编-c :将汇编翻译成为目标二进制文件 链接 :将目标二进制文件与相关库(C语言库)链接,形成可执行程序
讨论预处理阶段,去注释和宏替换那个先执行
#include<stdio.h>
#define BOSS
int main(){
BOSS printf("hello C");
return 0;
}
先看这个代码,思考先宏替换还是去注释 实际上:
结论:预处理期间:先执行去注释,在进行宏替换
思考以下代码:
代码1
#define sum(X) (X)+(X)
int main()
{
printf("%d\n", sum(10));
printf("sum(10)");
}
第二个会完成宏替换吗?
答案是不会的,会被看为字符串
代码2
#define BOSS(a,b) \
a = 0;\
b = 0;
int main(){
int flag = 0;
scanf("%d", &flag);
int a = 20;
int b = 30;
printf("before:%d %d", a, b);
if (flag)
BOSS(a, b);
else printf("you can see me\n");
printf("after:%d %d\n", a, b);
return 0;
}
为什么报错呢? 解决方法一:加大括号呀,这样if后大括号里可以放多条语句呀
#define BOSS(a,b) \
a = 0;\
b = 0;
int main(){
int flag = 0;
scanf("%d", &flag);
int a = 20;
int b = 30;
printf("before:%d %d\n", a, b);
if (flag){
BOSS(a, b);
}
else printf("you can see me\n");
printf("after:%d %d\n", a, b);
return 0;
}
解决方法2:
#define BOSS(a,b) \
do{\
a = 0;\
b = 0;\
} while (0)
int main(){
int flag = 0;
scanf("%d", &flag);
int a = 20;
int b = 30;
printf("before:%d %d\n", a, b);
if (flag)
BOSS(a, b);
else printf("you can see me\n");
printf("after:%d %d\n", a, b);
return 0;
}
这样就是实现了宏替换多条语句!!!
#undef
两个问题 宏可以在main函数里面定义吗? 宏的作用域如何? 这可以说明宏定义的位置是任意的
结论:宏的有效范围,是从定义处往下有效,之前无效
#undef的作用
这是没有使用#undef
结论:undef是取消宏的意思,可以用来限定宏的有效范围
|