宏是什么
計算機科學里的宏是一種抽象(Abstraction),
它根據一系列預定義的規則替換一定的文本模式。
解釋器或編譯器在遇到宏時會自動進行這一模式替換。
對於編譯語言,宏展開在編譯時發生,進行宏展開的工具常被稱為宏展開器。
絕大多數情況下,“宏”這個詞的使用暗示着將小命令或動作轉化為一系列指令。
個人理解,
大體就是用簡單標識預設一些操作,在程序真正執行前將執行操作帶人。
有時候又叫宏語言,有自己的語法:表現上宏變量和宏函數。
在c語言中,用define定義宏,可以達到常規語法的常量和方法的效果。
為什么不直接叫常量和方法,
個人覺得是宏本身是單獨的一個概念,然后引進到C語言中,雖然和C語言語法結構有類似,但有其獨立存在概念。
1,用#define 定義常量來增強可讀性
#define MAX_ARRAY_LENGTH 20
2,預定義宏
在編程中您可以使用這些宏 __DATE__ 當前日期,一個以 "MMM DD YYYY" 格式表示的字符常量。 __TIME__ 當前時間,一個以 "HH:MM:SS" 格式表示的字符常量。 __FILE__ 這會包含當前文件名,一個字符串常量。 __LINE__ 這會包含當前行號,一個十進制常量。 __STDC__ 當編譯器以 ANSI 標准編譯時,則定義為 1。
#include <stdio.h> main() { printf("File :%s\n", __FILE__ ); printf("Date :%s\n", __DATE__ ); printf("Time :%s\n", __TIME__ ); printf("Line :%d\n", __LINE__ ); printf("ANSI :%d\n", __STDC__ ); }
輸出:
File :test.c Date :Jun 2 2012 Time :03:36:24 Line :8 ANSI :1
3,創建宏使用到的運算符
3.1宏延續運算符:反斜杠(\)
#define message_for(a, b) \ printf(#a " and " #b ": We love you!\n")
3.2,字符串常量化運算符(#),可將參數的名稱直接輸出
#include <stdio.h> #define message_for(a, b) \ printf(#a " and " #b ": We love you!\n") int main(void) { message_for(Carole, Debra); return 0; }
輸出:
Carole and Debra: We love you!
3.3,標記粘貼運算符(##):可以將變量值和某個名稱合並稱為一個需要的變量名稱
#include <stdio.h> #define tokenpaster(n) printf ("token" #n " = %d", token##n) int main(void) { int token34 = 40; tokenpaster(34); return 0; }
結果:
token34 = 40 相當於:printf ("token34 = %d", token34);
4,宏函數,又叫參數化宏
#define square(x) ((x) * (x)) 相當於如下函數效果: int square(int x) { return x * x; } 只是宏函數,不需要定義參數和返回類型
必須使用 #define 指令定義。參數列表是括在圓括號內,且必須緊跟在宏名稱的后邊。宏名稱和左圓括號之間不允許有空格。
#include <stdio.h> #define MAX(x,y) ((x) > (y) ? (x) : (y)) int main(void) { printf("Max between 20 and 10 is %d\n", MAX(10, 20)); return 0; } 結果: Max between 20 and 10 is 20
宏函數參數是類型無關的,並且預編譯器不做語法檢查,容易出錯,
優點:直接被替換效率高,不用反復調用像普通方法。