飛書文檔https://x509p6c8to.feishu.cn/wiki/DzSJwsGiTiXkeCkyEYUcuXbKnbf
C 預處理是編譯過程中一個單獨的步驟,是一個文本替換工具而已。所有的預處理命令都是以井號(#)開頭。
指令 | 描述 |
#define | 定義宏 |
#ifdef | 如果宏已經定義,則返回真 |
#ifndef | 如果宏沒有定義,則返回真 |
#endif | 結束一個 #if……#else 條件編譯塊 |
#define
#define MAX_ARRAY_LENGTH 20 |
這個指令告訴編譯器把所有的 MAX_ARRAY_LENGTH 定義為 20。使用 #define 定義常量來增強可讀性。
#include <stdio.h>
#define MESSAGE "You wish!"
#define MAX_ARRAY_LENGTH 20
int main(void)
{printf("Here is the message: %s\n", MESSAGE);printf("max array length : %d\n", MAX_ARRAY_LENGTH );??return 0;
}
當上面的代碼被編譯和執行時,它會產生下列結果:
Here is the message: You wish!
max array length : 20
#define更多用法
宏定義函數
C語言一個強大的功能是可以使用參數化的宏來模擬函數。例如,
int square(int x) {return x * x;
}
我們可以使用宏重寫上面的代碼,如下:
#define square(x) ((x) * (x))
在使用帶有參數的宏之前,必須使用 #define 指令定義。參數列表是括在圓括號內,且必須緊跟在宏名稱的后邊。宏名稱和左圓括號之間不允許有空格。例如:
#include <stdio.h>#define square(x) ((x) * (x))int main(void)
{printf("10*10=%d\n", square(10));?return 0;
}
宏延續運算符(\)
一個宏通常寫在一個單行上。但是如果宏太長,一個單行容納不下,則使用宏延續運算符(\)。例如:
#define square(x) \((x) * (x))
標記粘貼運算符(##)
宏定義內的標記粘貼運算符(##)會合并兩個參數。它允許在宏定義中兩個獨立的標記被合并為一個標記。例如:
#include <stdio.h>#define tokenpaster(n) printf ("token = %d", token##n)int main(void)
{int token34 = 40;tokenpaster(34);return 0;
}
當上面的代碼被編譯和執行時,它會產生下列結果:
token = 40
#ifndef
#ifndef TEST#define MESSAGE "You wish!"
#endif
這個指令告訴編譯器只有當 MESSAGE 未定義時,才定義 MESSAGE,常用于頭文件,防止重復引用。
C |
#ifdef
#ifdef DEBUG |
這個指令告訴 CPP 如果定義了 DEBUG,則執行處理語句,常用于編譯選擇,例如下發工程,如果我們只希望在調試時打印信息,正式發布不打印信息。
#include <stdio.h>#define DEBUG
#ifdef DEBUG#define MESSAGE "You wish!"
#endifint main(void)
{#ifdef DEBUGprintf("Here is the message: %s\n", MESSAGE);#endifreturn 0;
}