#define是預處理處理的單元實體之一。
定義的巨集可以出現在程式的任意位置,定義之後**都可以使用這個巨集。
預處理器不會進行語法分析的(直接進行文字替換),後面的編譯器才進行語法分析,這個過程很容易產生歧義錯誤。
#define 定義的巨集常量可以直接使用
#define 定義的巨集常量本質為字面量
#define error -1
#define path1 "d:\test\test.c"
#define path2 d:\test\test.c
#define path3 d:\test\
test.c
int main()
預處理處理結果(沒有任何編譯錯誤)
編譯結果,可以發現是有編譯錯誤的。
巨集定義的效率高於函式呼叫
#define _sum_(a, b) (a) + (b)
#define _min_(a, b) ((a) < (b) ? (a) : (b))
#define _dim_(a) sizeof(a)/sizeof(*a)
int main()
; int s1 = _sum_(a, b);
int s2 = _sum_(a, b) * _sum_(a, b);
int m = _min_(a++, b);
int d = _dim_(c);
printf("s1 = %d\n", s1);
printf("s2 = %d\n", s2);
printf("m = %d\n", m);
printf("d = %d\n", d);
return 0;
}
預處理之後:
注意:s2中已經改變了程式本來的意思!!
#define _sum_(n) ((n>0)? (_sum_(n-1)+n):0)
巨集定義的常量或者表示式沒有作用域限制。
巨集定義的常量或表示式是沒有「作用域的」(即上面定義下面就可以使用了,因為巨集定義是在預編譯處理階段就被替換了,而編譯器不知道這些替換的存在),c語言中作用域是針對變數和函式的。
1.預處理器直接對巨集進行文字替換,使用的引數不會進行求值運算
2.預處理器不會對巨集定義進行語法檢測,出現的錯誤只能在編譯的時候被檢查出來
3.巨集定義效率高於函式呼叫,當然也會帶來一定的***。
C 21 巨集定義與使用分析
test.c define error 1 define path1 d test test.c define path2 d test test.c define path3 d test 成為接續符 test.c int main test.i 1 test.c 1 1 1 test.c int...
C語言高階 21 巨集定義與使用分析
define是預處理器處理的單元實體之一 define定義的巨集可以出現在程式的任意位置 define定義之後的 都可以使用這個巨集。define定義的巨集常量可以直接使用 define定義的巨集常量本質為字面量 不占用記憶體 唯讀儲存區 和const常量 變數,佔記憶體 的本質區別 下面的巨集定義...
巨集定義與使用分析
巨集定義常量 define巨集定義常量可以出現在 的任何地方 define從本行開始,之後的 都可以使用這個巨集常量 以上巨集定義都正確 最後乙個巨集定義採用了接續符 等同於 define path 3 d delphi ctopic3.ppt 巨集定義表示式 define表示式有函式呼叫的假象,卻...