C 21 巨集定義與使用分析

2021-09-13 02:08:09 字數 2584 閱讀 1707

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 main()

分析: 預處理不會報錯,只是進行的巨集文本替換,編譯階段報錯
#include #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);

}

輸出:【部分輸出不是我們期望的】

s1 = 3

s2 = 5 【非期望輸出】

m = 2 【非期望輸出】

d = 4 【巨集表示式的強大】

分析:

int s1 = (a) + (b);

int s2 = (a) + (b) * (a) + (b); // 預處理後語義發生改變

int m = ((a++) < (b) ? (a++) : (b)); // 預處理後語義發生改變

int d = sizeof(c)/sizeof(*c);

在使用巨集時,多使用 () 是好的習慣

#define _sum(a, b) (a) + (b)

_sum(a, b) * _sum(a, b) ==> ((a) + (b)) * ((a) + (b))

#define _sum_(n)((n>0) ? (_sum_(n-1)+n) : 0)
.c ==> .i

((10>0) ? (_sum_(10 -1)+10) : 0);
#include void def()

double area(double r)

int main()

輸出:

pi = 3.141593

d = 5; a = 78.539815

分析:定義巨集之後的**可以直接使用當前巨集。

巨集編譯器被預處理器處理,編譯器不知道巨集識別符號的存在,因此編譯器無法將作用域的概念用於識別符號。

巨集

含義示例

_file_

被編譯的檔名

file1.c

_line_

當前行號

25_date_

編譯時的日期

jan 31 2012

_time_

編譯時的時間

17:01:01

_stdc_

編譯器是否遵循標準c規範

1

#include #include #define malloc(type, x) (type*)malloc(sizeof(type)*x)    // 巨集的強大

#define free(p) (free(p), p=null) // 巨集的強大

#define log(s) printf("[%s] %s \n", __date__, __file__, __line__, s) // 巨集的強大

#define foreach(i, m) for(i=0; i#define begin

int main()

輸出:

[dec 3 2018] begin to run main code ...

0 1

2 3

4 [dec 3 2018] end

C 21 巨集定義與使用分析

define是預處理處理的單元實體之一。定義的巨集可以出現在程式的任意位置,定義之後 都可以使用這個巨集。預處理器不會進行語法分析的 直接進行文字替換 後面的編譯器才進行語法分析,這個過程很容易產生歧義錯誤。define 定義的巨集常量可以直接使用 define 定義的巨集常量本質為字面量 defi...

C語言高階 21 巨集定義與使用分析

define是預處理器處理的單元實體之一 define定義的巨集可以出現在程式的任意位置 define定義之後的 都可以使用這個巨集。define定義的巨集常量可以直接使用 define定義的巨集常量本質為字面量 不占用記憶體 唯讀儲存區 和const常量 變數,佔記憶體 的本質區別 下面的巨集定義...

巨集定義與使用分析

巨集定義常量 define巨集定義常量可以出現在 的任何地方 define從本行開始,之後的 都可以使用這個巨集常量 以上巨集定義都正確 最後乙個巨集定義採用了接續符 等同於 define path 3 d delphi ctopic3.ppt 巨集定義表示式 define表示式有函式呼叫的假象,卻...