第六章預處理

2021-06-21 18:06:20 字數 1278 閱讀 9063

在程式設計中,為了方便,有的時候我們會使用巨集定義,首先,我們要明確一點,巨集定義與函式式不同的,巨集定義的功能就是替換,在編譯時替換掉**裡面的使用巨集的地方。

如求兩個數中大的乙個:

#define max(x,y) ((x) > (y) ? (x) : (y))
在使用巨集定義時間,我們要注意幾點:

1.定義時中間不能有空格,如:

#define f (x) ((x) * (x))
**的原意是定義這樣乙個替換f(x) = x * x; 但是,在這裡的效果是f被 (x) ((x) * (x))這樣乙個整體替換了,顯然不對了。

巨集定義在定義時中間不要有多餘的空格,在使用的時候沒關係,如:

#define f(x) ((x) * (x))
使用時:

f   (1);等價於f(1);

2.進行巨集定義時,在一些地方要加上括號,

#define abs(a) a > 0 ? a : -a

printf("%d\n", abs(2)+1);//結果為2
替換後的結果:2 > 0 ? 2 : -2 + 1 ,顯然不對;

3.可能出現重複計算的情況:一方面會使得效率低下,另一方面,有可能出錯;

int a[10] = , big = 0, i = 1, n = 4;

while(i < n)

執行結果如下:

不是2,3,4,這裡就是因為,a[i++]在用max()替換後被重複計算了,導致出錯了。

4.巨集定義與typedef的一些異同:

相同之處:定義單個變數

#define f int

typedef int g;

f a;

g b;

不同之處:定義多個變數

#define ff int*

typedef int* gg;

ff a, b;//這裡a是int型指標,b是int型整數

gg c, d;//這裡c和d都是int型指標

第六章 預處理器

巨集就是文字展開,實際中可以展開寫出來發現錯誤。6.1 不能忽視巨集定義中的空格 6.2 巨集並不是函式 巨集定義乙個函式時,1 要把每個引數用括號括起來 2 同時也要把整個表示式括起來。3 要確保巨集中的引數沒有 define max a,b a b a b max big,x i 這時 有可能被...

第六章 預處理器

今天花了點時間把第六章看了。1.不能忽視巨集定義中的空格。與巨集呼叫相比,巨集定義顯得 暗藏機關 例如下列 define f x x 1 答案有兩種 1.f x 代表 x 1 2.f 代表 x x 1 正確答案是第二種,因為f與 x 之間多了乙個空格!這一規則不適用於巨集呼叫,只適用 於巨集定義,也...

mysql第六章 第六章 mysql日誌

第六章 mysql日誌 一 錯誤日誌 錯誤日誌的預設存放路徑是 mysql 存放資料的地方 hostname.err 1.修改錯誤日誌存放路徑 mysqld log error data mysql mysql.log 2.檢視配置命令 show variables like log error 3...