唉,还是要拓展一下宏定义,不能只知道#define PI 3.14
乐。
第一个例子,"##"
#include <stdio.h>
#define f(g,g2) g##g2
int main(){
int var12=100;
printf("%d",f(var,12));
return 0;
}
//运行结果:100
#define f(g,g2) g##g2
:这是一个宏定义。##
是预处理器运算符,用于将两个符号连接成一个新的符号。在这里,宏f(g,g2)
接受两个参数并将它们连接在一起。printf("%d", f(var,12));
:这行代码使用了printf
函数来打印一个整数。f(var,12)
是宏展开后的结果。根据宏定义,f(var,12)
展开为var12
,因为g
是var
,g2
是12
,而##
运算符将它们连接在一起。所以最终,后面就是变量var12。
第二个例子,表达式
#include <stdio.h>
#define prod(a,b) a*b
int main(){
int x=3,y=4;
printf("%d",prod(x+2,y-1));
return 0;
}
//运行结果:10
代入时,仅是文本替换,没有括号!
例如这道题替换后就是x+2*y-1
,所以结果就是10。
第三个例子,究极套娃表达式
#include <stdio.h>
#define f(a,b,x) a*x+b
int main(){
printf("%d,%d",f(1,2,3),f(f(1,2,3),4,2));
return 0;
}
//运行结果:5,11
要点:千万不要把里面的f(1,2,3)
算出结果,直接文本替换!
第四个例子,重定义
#include <stdio.h>
#define a 10
int main(){
#define a 50
printf("%d",a);
return 0;
}
//运行结果:50
虽然说这样写编译器会警告重定义,但是运行结果是由最近的宏定义决定的。
第五个例子,文字替换最逆天的一集
#include <stdio.h>
#define scanf "%s ABC"
int main(){
printf(scanf, scanf);
//printf("%s ABC", "%s ABC");
return 0;
}
//运行结果:%s ABC ABC
自行体会
© 版权声明
若无特殊说明,文章版权归作者所有,请勿转载至任何平台。
THE END
- 最新
- 最热
只看作者