原文參考:
關於#和##在c語言的巨集中,
我們使用#把巨集引數變為乙個字串,用##把兩個巨集引數貼合在一起.
#define str(s) #s
#define cons(a,b) int(a##e##b)
printf(str(vck)); // 輸出字串"vck"
printf("%d\n", cons(2,3)); // 2e3 輸出:2000 1.
#的功能是將其後面的巨集引數進行字串化操作
(stringfication),
簡單說就是在對它所引用的巨集變數通過替換後在其左右各加上乙個雙引號。
比如下面**中的巨集:#define warn_if(exp)
dowhile(0)
那麼實際使用中會出現下面所示的替換過程:warn_if (divider == 0);
被替換為
do while(0);
這樣每次divider(除數)為0的時候便會在標準錯誤流上輸出乙個提示資訊。
2. 而##被稱為連線符(concatenator),用來將兩個token連線為乙個token。
注意這裡連線的物件是token就行,而不一定是巨集的變數。比如你要做乙個選單項命令名和函式指標組成的結構體的陣列,並且希望在函式名和選單項命令名之間有直觀的、名字上的關係。那麼下面的**就非常實用:
struct command
;#define command(name)
// 然後你就用一些預先定義好的命令來方便的初始化乙個command結構的陣列了:
struct command commands =
C 和 在巨集定義中的作用
將右邊的引數做整體的字串替換。define string x x x define text x name x inttest 將左右兩邊的引數做整體的字串拼接替換。define class name name class name define merge a,b a b a inttest 對於...
和 在巨集替換中的作用
include define f a,b a b define g a a define h a g a int main 首先需要了解 和 的意義。將右邊的引數做整體的字串替換。define g a a 則g hello world hello world g sleep 1 sleep 1 對於...
python 巨集替換 和 在巨集替換中的作用
include define f a,b a b define g a a define h a g a int main printf s n h f 1,2 printf s n g f 1,2 return 0 首先需要了解 和 的意義。將右邊的引數做整體的字串替換。define g a a ...