C 21 巨集定義與使用分析

2021-09-29 23:21:01 字數 2149 閱讀 9575

#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表示式有函式呼叫的假象,卻...