和 在巨集替換中的作用

2022-07-29 15:12:12 字數 1054 閱讀 5025

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