#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.無需函式呼叫,執行效率高 對於一些簡單的操作,無需呼叫函式,雖然程式設計是強調模組化,但是函式呼叫時,需要保護現場和恢復現場。這些都需要耗時。對於複雜的操作來講,這些耗時可以不計,但是對於簡單...