hhhh,关于宏定义,现在就给大家普及一部分
最基本的定义常量
#define PI 3.1415926
这种方式相信大家一定都知道吧
但如果是关于可变参数的呢
!!!第一种
1 #include<stdio.h> 2 3 #define OJBK(s) #s //#表示将s转化为字符,也可以放字符串,s也可以用其他字符或字符串 4 5 int main() 6 { 7 printf(OJBK(Hello World! %d),999);//括号里面的空格会被看成一个, 8 return 0; 9 }
现在大家一定会因为这个printf根本没打引号而感到奇怪吧。
现在我就给你们解释一下。
先说引号吧,根据我自己的理解,引号就是将一串字母数字符号转换为字符的工具
所以加引号就是为了转换为字符,而我们的‘#’却可以完成这项操作。所以没有引号我们也可以正常的运行
而OJBK()后面的就是普通操作
!!!第二种
#include<stdio.h> #define OJBK(...) printf(# __VA_ARGS__) //其中的...表示可变参数,而__VA_GARS__在处理中被实际参数所替换,这都是不能改变的。然后具体作用就自己敲一个来看效果吧。 int main() { OJBK(Hello, World!); return 0; }
接下来我们来说说第三种‘##’
#include<stdio.h> #define OJBK(x,y) x ## y //##的作用就是将两个连接起来,不过目前来说好像只发现可以连接数字 int main() { printf("%d",OJBK(5,20)); //输出当然就是520啦 return 0; }
然后还有最后一种
#include<stdio.h> #define OJBK(format,...) printf(#format,## __VA_ARGS__) //format是可以修改的,表示你想要转换成字符的一串而逗号为分隔,#不对逗号以后的起作用,所以逗号后面的不是字符 int main() { OJBK(Hello World! %d%s,520," Iwpml-595");如果想输出%s的字符串就必须加引号,如果是数字就可以直接写数字,但前面一定要有%s%d之类的 return 0; }
剩下的就是宏定义替换的骚操作了
比如说#define hhh scanf //这就表示hhh是scanf的同义词,能用scanf 的地方一般hhh也可以
还有很多关于宏定义的骚操作,我就不细说了,剩下的就靠你们自己去探索吧!