python 巨集替換 和 在巨集替換中的作用

2021-10-12 10:41:43 字數 1217 閱讀 8260

#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

則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

char *name;

void (*function) (void);

struct command commands =,,

構造乙個這樣的commands陣列,是為了在後續的設計中,可以通過互動式的字串輸入,來動態地執行相應的函式。字串自身作為字首,」_command」作為字尾。

手工構造這樣第乙個commands陣列顯得非常冗餘,還容易造成不必要的拼寫錯誤。下面來看看這個巨集替換版本。

#define command(name) 

struct command commands =

command (quit),

command (help),

清晰了很多!

和 在巨集替換中的作用

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巨集替換 簡單的巨集替換

簡單的巨集替換 1.巨集定義必須寫在第一次使用該巨集定義的 之前 2.巨集定義不是以分號結束的 3.define string1 string2 之間至少要有乙個空格 4.string 1稱為巨集,string2 稱為巨集擴充套件 5.巨集名用大寫的字母表示是乙個習慣 6.使用巨集的好處 a 簡化程...

巨集定義與巨集替換

一.c c 語言中使用巨集的主要目的主要有 3 個 1.提高 的可讀性 把用到的常量定義成有意義的名字 2.無需函式呼叫,執行效率高 對於一些簡單的操作,無需呼叫函式,雖然程式設計是強調模組化,但是函式呼叫時,需要保護現場和恢復現場。這些都需要耗時。對於複雜的操作來講,這些耗時可以不計,但是對於簡單...