1 .最簡單且最常見的define用法
#define N 100
編譯器在預處理程序時,會將程序中所有的N用100來替換,換言之,不同於const常量,define其實本質上對文本內容的替換。
下面是define和const的區別:
- define是宏定義,程序在預處理階段將用define定義的內容進行了 替換 。因此在程序運行時,常量表中並沒有用define定義的常量,系統不爲它分配內存。
而const定義的常量,在程序運行時,存在常量表中,且系統爲它分配內存。 - define定義的常量,預處理時只是直接進行了替換,因此在編譯時不能進行數據類型檢驗。
而const定義的常量,在編譯時進行嚴格的類型檢驗,可以避免出錯。 - define定義表達式時要注意“邊緣效應”。
例如:
#define N 1+2
float a = N/2.0;
/*
按照常規做法,可能會認爲結果是3/2 = 1.5
但是實際上,結果應該爲1+2/2.0 = 2.0
若想要實現3/2,則#define N (1+2)
即爲避免邊緣效應,一定要加!括!號!
*/
2 .用define定義函數
舉個例子:
#include<stdio.h>
#define PI 3.14
#define S(r) PI*r*r
int main(void)
{
printf("area = %f", S(1+2));
rerturn 0;
}
結果:
3.14*1+2*1+2 = 3.14+2+2 = 7.14
重要的事情再說一遍:宏其實就是一個簡單的文本替換!
3 .不常用的define用法
#define Conn(x,y) x##y
#define ToChar(x) #@x
#define ToString(x) #x
x##y表示x連接y
- 比如: int n = Conn(123,456);
- 結果: n=123456;
- char* str = Conn(“asdf”, “adf”);
- 結果: str = “asdfadf”;
而#@x,其實就是給x加上單引號,結果返回一個const char。
- 比如:char a = ToChar(1);
- 結果:a=’1’;
做個越界試驗 char a = ToChar(123);結果是a=’3’; 但是如果參數超過四個字符,編譯器就會報錯!
至於#x,就是給x加上雙引號
- 比如:char* str = ToString(123132);
- 結果:str=”123132”;
4 .定義宏和取消宏
定義宏使用#define
取消宏定義使用#undef