C's Macro Introduction
1.The Connect Macros: ##
這是一個預處理連接符,這個操作符主要用來將兩個符號連接成為一個完整的宏符號。通過下面的代碼,可以看到其具體的使用方法:
- 如下例子:
#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;
}
- 運行結果如下所示:
2.The Variadic Macros: ...
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__
宏當中。
2. 運行結果如下所示:
3.The Other Macros:__FILE__
__LINE__
__FUNCTION__
- 基本概念:
- FILE:宏在預編譯時會替換成當前的源文件名.
- LINE:宏在預編譯時會替換成當前的行號.
- FUNCTION:宏在預編譯時會替換成當前的函數名稱.
- TIME:在源文件中插入當前編譯時間.
- DATE:在源文件中插入當前的編譯日期.
- Coding:
#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;
}
當程序在預編譯過程當中,上述的三種宏就被替換成了對應的數值或者字符串了。
- 運行結果:
4.The FUNC Macro.
通常我們將某些簡短的函數直接改寫為宏定義,這就減少了我們在調用過程中的代碼編寫。
如#define pi 3.14
稱作變量式宏定義,再如#define MAX(a,b) (a>b?a:b)
稱為函數時宏定義。具體例子如下:
- Codeing:
#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;
}
- Result: