##
這是一個預處理鏈接符,這個操做符主要用來將兩個符號鏈接成爲一個完整的宏符號。經過下面的代碼,能夠看到其具體的使用方法: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; }