#include <stdio.h>
# define M 10
# define N 10+10+10
int main(int argc, const char * argv[]) {
int num = M+10;
printf("M = %i\n",M);
printf("num = %i\n",num);
// 宏值是整个表达式,而并不是计算的结果
int num1 = N * 2;
printf("num1 = %i\n",num1);
return 0;
}
无论宏值是什么东西,在定义宏的时候不会去检查语法,只有当完成了宏替换的时候才会去检查替换以后是否符合语法规范
如果宏值是一个表达式,宏值并不是这个表达式的结果,而是这个表达式的本身
如果宏值中包括一个变量名,那么在使用这个宏之前必须保证这个变量存在不然就会报错
# define X a+a
int main(int argc, const char * argv[]) {
int a = 10;
int num2 = X;
return 0;
}
# define P 3
# define A 5
# define JISUAN P*A
int main(){
printf("JISUAN = %i\n",JISUAN);
}
# define p printf
# define d "%i"
int main(){
p(d,10);
return 0;
}
# define B(a) a+10+a
int main(){
// 有参数的宏
int num3 = B(8);
printf("num3 = %i\n",num3);
return 0;
}
# define MAX(a,b) a > b ? a:b
int main(){
printf("最大值是:%i\n",MAX(10, 0));
return 0;
}
# define M 10
int main(){
// 条件编译指令
#if M == 10
printf("我是条件编译指令的代码\n");
#endif
return 0;
}
// 输出:我是条件编译指令的代码
int m = 10;
#if m == 10
printf("我是 变量 m == 10 才会执行的代码\n");
#endif
# define M 10
int main(){
#if M > 0
printf("M>0编译这个代码\n");
#elif M > 0 && M < 20
printf("M > 0 && M < 20编译这个代码\n");
#elif M >20 && M < 40
printf("M >20 && M < 40编译这个代码\n");
#else
printf("否则编译这个代码");
#endif
return 0;
}
#define M 10
int main(){
// 第三种用法
#if M
printf("如果定义了这个宏,就执行这个代码\n");
#endif
return 0;
}
int main(){
// 第三种用法
#ifndef M
printf("如果没有定义了这个宏,就执行这个代码\n");
#endif
return 0;
}
// 在调试的时候,调试信息有很多,又不想每次都一个一个的删除,那么可以使用条件编译指令,每次只需要修改自己定义的宏就可以对 printf 函数的控制
#include <stdio.h>
# define SHAN_DEBUG 0
# if SHAN_DEBUG == 0
# define print(val1,val2) printf(val1,val2)
# else
# define print(val1,val2)
# endif
int main(int argc, const char * argv[]) {
print("%d",10);
return 0;
}
// 无论一个文件包被#include 多少次,我只引入一次
#ifndef lianxi_h
#define lianxi_h
#include <stdio.h>
// 写自己的代码
#endif /* lianxi_h */
// 原理:在 main.c中#include lianxi.h,导入很多次,#include 的作用就是将此文件全部复制过来,所以复制第一次在编译的时候如果没有导入 lianxi.h 这个文件,全部被copy 过来,此时没有定义 lianxi.h 这个宏,那么就定义这个宏 lianxi.h,然后在第二次copy 过来的时候,发现定义了这个 lianxi.h 这个宏,所以就不会重复的 copy 了
原文:https://www.cnblogs.com/shanshan-test/p/13157147.html