#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)
對於#的引數,即便是另乙個巨集,也不展開,仍然作為字串字面資訊輸出。
所以,g(f(1,2)) à f(1,2)
對於h(f(1,2)),由於h(a)是非#或##的普通巨集,需要先巨集展開其引數a,即展開f(1,2)為12,則h(a) 巨集替換為h(12),進而巨集替換為g(12), 進而巨集替換為12
## 將左右兩邊的引數做整體的字串拼接替換。
#define f(a,b) a##b
則f(1,2) à 12, f(i,1) à i1
同#,對於##的引數,即便是另乙個巨集,也不展開,仍然作為字串字面資訊輸出。
此外,有乙個限制是,經過##替換後的內容必須能夠作為乙個合法的變數。
以上f(i,1) à i1中,如果程式中沒有i1的定義,或者通過f(1,i)構成1i,則即便是通過了巨集替換,也不能編譯通過。
日常實踐中,##是常用的替換。尤其在通過c的函式指標來模擬動態繫結時大有用處。
下面是從stackoverflow(具體id記不清了)上摘取的乙個例子。
struct command
;struct command commands =,,
...};
構造乙個這樣的commands陣列,是為了在後續的設計中,可以通過互動式的字串輸入,來動態地執行相應的函式。字串自身作為字首,」_command」作為字尾。
手工構造這樣第乙個commands陣列顯得非常冗餘,還容易造成不必要的拼寫錯誤。下面來看看這個巨集替換版本。
#define command(name)
struct command commands =
;清晰了很多!
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 ...
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 對於...
關於 和 在C語言的巨集中的使用
原文參考 關於 和 在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....