define巨集定義的簡單總結

2021-05-23 20:46:51 字數 2458 閱讀 7591

1:  

#define pi 3.1415926

2:  

#define char_a 'a'

3:  

#define string_a "a"

1:  

#define square(x) ((x)*(x))

2:  

3:  

inta

=square(2

);

4:  

intb

=square(2

+3);

使用引數的巨集定義中,注意在巨集的替換主體部分對引數使用括號。上例中如果是#define square(x)  (x*x),在square(2+3),就會被展開為(2+3*2+3),結果就大不一樣了。

1:  

#define psqr(x) printf("the square of x is %d./n", ((x)*(x)))

如果使用psqr(8),輸出效果如下:

the square of x is 64. 

字串中的x被看作是普通文字,不做處理。

在類函式的替換部分中,#符號用作乙個預處理運算子,它可以把與語言符號轉化為字串。例如,如果x是乙個巨集參量,那麼#x可以把引數名轉化為相應的字串。該過程成為字串化(stringizing)。

如果想列印出變數的名稱,就應該按照下面的方式使用(#運算子)。

1:  

#define psqr(x) printf("the square of " #x " is %d./n", ((x)*(x)))

上面psqr(8)輸出的結果就是:

the square of 8 is 64.

和#運算子一樣,##運算子可以用於類函式巨集的替換部分。另外,##還可以用於類物件巨集的替換部分。這個運算子把兩個語言符號組合成單個語言符號。例如,可以定義如下的巨集:

#define xname(n) x##n

這樣,下面的巨集呼叫:

xname(4)

會展開成下列形式:

x4 比如可以使用:

int xname(4) = 14 ;

這展開的意義為:

int x4 = 14 ;

可以使用這種方法來按照某種規則定義變數,只需要將變數規則中可變部分讓使用者來輸入,其餘不變部分就通過巨集來統一實現。

這裡需要注意的幾個問題:

如果巨集定義是:

#define x_def(n) xn

使用x_def(4),展開之後的效果是:

xn 這裡面的n不會看做是單個語言符號。

如果有這樣的定義:

1:  

#define def_1(n) var.##n

2:  

#define def_2(n) var.n

3:  

4:  

#define def_3(n) (##n)

5:  

#define def_4(n) n

6:  

#define def_5(n) #n

7:  

8:  

struct

__y_t

var;

11:  

12:  

inta=0

;

13:  

14:  

intmain

(void

)

15:  

上面**中:

第4行定義使用括號的原因在於##不能放在頂換部分的行首或者行尾。

語句1和語句3的錯誤在於,編譯器試圖將"."與"("與a相連線,但是由於這兩個字元都不是有效的c語言命名規則中的字元,所以會提示錯誤。從這裡可以看出,##主要是用來連線成單個語言符號的,所以其前面的字元應該是有效字元。所以x##n正確,但是var.##n反而是錯誤的。如果前面不是有效字元的話,直接使用常規用法就行了,就像上面**中的def_2一樣。

語句5的錯誤在於展開後相當於

"a" = 8 ;

a被轉換為字串了。

通過上面測試,可以加深對巨集定義的理解。

可變巨集:…和__va_args__

巨集定義中引數列表的最後乙個引數為省略號(三個英文句號,省略號只能代替最後引數)。這樣,預定義巨集__va_args__就可以被用在替換部分中,以表明省略號**什麼。例如:

1:  

#define pr(...) printf(__va_args__)

2:  

#define px(x,...) printf("message " #x ": " __va_args__)

define巨集定義

預處理指令 以 開頭的行,都預處理指令,用於指示編譯器做一些預處理工作。比如 include h 注 預處理指令不是語句,行尾不要加分號 define的兩種用法 1.定義乙個 數值 2.定義乙個 算式 注 工程中應該避免使用這兩種方式 定義乙個值 define pi 3.14 int main 定義...

巨集定義 define

巨集定義又稱為巨集代換 巨集替換,簡稱 巨集 格式 define 識別符號 字串 其中的識別符號就是所謂的符號常量,也稱為 巨集名 預處理 預編譯 工作也叫做巨集展開 將巨集名替換為字串。1 define printx printf d n x 在c程式中,以 字元開頭的 都是一條c預處理器語句。預...

define巨集定義

include include define sub x,y x y define access before element,offset,value sub element,offset value using namespace std int main access before array...