打赏

强大的宏定义

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!\n%d%s,520," Iwpml-595");如果想输出%s的字符串就必须加引号,如果是数字就可以直接写数字,但前面一定要有%s%d之类的
    return 0;
}

剩下的就是宏定义替换的骚操作了

比如说#define  hhh  scanf //这就表示hhh是scanf的同义词,能用scanf 的地方一般hhh也可以

还有很多关于宏定义的骚操作,我就不细说了,剩下的就靠你们自己去探索吧!

posted @ 2018-11-18 21:52  Onebelieve  阅读(342)  评论(0编辑  收藏  举报