C語言深度解剖(第三章-預處理讀書筆記)

3.1宏定義

3.1.1 數值宏常量
#define定義的常量從本行宏定義開始,以後代碼都認識這個宏,任何東西都可定義爲宏。
編譯器在預處理時就會用真身替換替身

eg:

#define PI 3.141592654

以後的代碼就可以用PI來代替3.141592654,這樣的好處是如果你想提高精度,只需要修改一次。
#define定義的宏是沒有類型的,而const修飾的數據是有類型的,爲了安全建議以後定義宏常量時儘可能用const代替,編譯器會給const修飾的只讀變量做類型校檢,減少錯誤。

eg:

#define MAX 100
建議使用
const int MAX=100

要注意const修飾的不是常量而是readonly變量,const修飾的只讀變量不能用來作爲定義數組的維數,也不能放在case關鍵字後面

eg:

int Array[MAX];
這個MAX可以用#define定義,但不能用const定義

#define FUN(a) "a"
int main()
{
    char* str=FUN(345);
    printf("%s\n",str);  //輸出結果:"a"
    printf(FUN(345));//輸出結果:"a"
    printf("FUN(345)");//輸出結果:"FUN(345)"
    return 0;
}

3.1.2 字符宏常量
除了定義宏常數外,經常還用來定義字符串,尤其路徑

#define ENG_PATH_1 E:\English\listen_to_this\listen_to_this_3 

3.7 #運算符

eg:

#define SQR(x) printf("The square of x is %d.\n", ((x)*(x))); 如果這樣使用宏:
SQR(8);
則輸出爲:The square of  x   is 64.

注意到沒有,引號中的字符 x 被當作普通文本來處理,而不是被當作一個可以被替換的語言符號。

假如你確實希望在字符串中包含宏參數,那我們就可以使用“#”,它可以把語言符號轉化爲字符串。上面的例子改一改:

#define SQR(x) printf("The square of "#x" is %d.\n", ((x)*(x)));
再使用:SQR(8);

則輸出的是:The square of 8   is 64.

3.8 ##運算符

##運算符可把兩個語言符號組合成單個語言符號。
eg:

#define XNAME(n)    x ## n

如果這樣使用宏:
XNAME(8)
則會被展開成這樣:
x8
發佈了57 篇原創文章 · 獲贊 12 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章