##
这是一个预处理链接符,这个操做符主要用来将两个符号链接成为一个完整的宏符号。经过下面的代码,能够看到其具体的使用方法:html
#include <stdio.h> struct macro { int N; char M; }; struct macro macro_drv = {100,20}; #define XNAME(n) x##n #define Macro(x) x##_drv.N int main(void) { char *XNAME(3) = "Hello,Macro(##)\n"; printf("%s",XNAME(3)); printf("The struct:%d\n",Macro(macro)); return 0; }
...
and __VA_ARGS__
在某些函数当中,须要接收变化数量的参数,例如基本的printf函数。
咱们能够经过将函数的最后一个参数定义为宏...
,这样函数就能够使用预约义的宏__VA_ARGS__
来表示变化数量的变量了。函数
#include <stdio.h> #define PR(x,...) printf("Message" #x ":" __VA_ARGS__) #define VA(x,y,...) printf(#x" "#y" "#__VA_ARGS__) int main(void) { PR(1,"%s,%s\n","Hello","Macro"); VA(I,am,Superman!); return 0; }
上述程序中输入给PR函数的参数一共有4个:1,"%s,%s\n","Hello","Macro"
,第一个参数是保存在x形参中的,剩下的三个参数保存在__VA_ARGS__
宏当中。3d
__FILE__
__LINE__
__FUNCTION__
#include <stdio.h> int main(void) { printf("The Source File Name:%s\n",__FILE__); printf("Current Code Line:%d\n",__LINE__); printf("Current Func Name:%s\n",__FUNCTION__); return 0; }
当程序在预编译过程中,上述的三种宏就被替换成了对应的数值或者字符串了。
一般咱们将某些简短的函数直接改写为宏定义,这就减小了咱们在调用过程当中的代码编写。
如#define pi 3.14
称做变量式宏定义,再如#define MAX(a,b) (a>b?a:b)
称为函数时宏定义。具体例子以下:code
#include <stdio.h> #define E 4 #define PI 3.14 #undef E // 将定义完成的宏撤销,能够从新定义一个名字叫E的宏. #define E 3 #define MAX(a,b) ((a)>(b)?(a):(b)) int main(void) { printf("The PI:%f\n",PI); printf("The Bigger:%f\n",MAX(PI,2.34)); return 0; }