如:
#define example(instr) printf("the input string is:\t%s\n",#instr)
#define example1(instr) #instr
當使用該宏定義時:
example(abc); 在編譯時將會展開成:printf("the input string is:\t%s\n","abc");
string str=example1(abc); 將會展成:string str="abc";
注意:
對空格的處理
a。忽略傳入參數名前面和後面的空格。
如:str=example1( abc ); 將會被擴展成 str="abc";
b.當傳入參數名間存在空格時,編譯器將會自動連接各個子字符串,用每個子字符串中只以一個空格連接,忽略其中多餘一個的空格。
如:str=exapme( abc def); 將會被擴展成 str="abc def";
2、## (token-pasting)符號連接操作符
宏定義中:參數名,即爲形參,如#define sum(a,b) (a+b);中a和b均爲某一參數的代表符號,即形式參數。
而##的作用則是將宏定義的多個形參成一個實際參數名。
如:
#define exampleNum(n) num##n
int num9=9;
使用:
int num=exampleNum(9); 將會擴展成 int num=num9;
注意:
1.當用##連接形參時,##前後的空格可有可無。
如:#define exampleNum(n) num ## n 相當於 #define exampleNum(n) num##n
2.連接後的實際參數名,必須爲實際存在的參數名或是編譯器已知的宏定義
#include <stdio.h>
#define paster( n ) printf_s( "token" #n " = %d", token##n )
int token9 = 9;
int main()
{
paster(9);
}
運行結果:
token9 = 9
3、@# (charizing)字符化操作符。
只能用於有傳入參數的宏定義中,且必須置於宏定義體中的參數名前。作用是將傳的單字符參數名轉換成字符,以一對單引用括起來。
#define makechar(x) #@x
a = makechar(b);
展開後變成了:
a= 'b';
4、\ 行繼續操作符
當定義的宏不能用一行表達完整時,可以用"\"表示下一行繼續此宏的定義。