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