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...