C語言速記(宏)


宏是什么

計算機科學里的宏是一種抽象(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

 

宏函數參數是類型無關的,並且預編譯器不做語法檢查,容易出錯,

優點:直接被替換效率高,不用反復調用像普通方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM