C 巨集中的 和

2021-10-02 14:36:03 字數 1055 閱讀 5584

rt,

#define func(a)  #a  

#define funcs(a,b)  a##b

第乙個#a的作用是將巨集引數a變成字串,如下面例子中,將對應的版本號轉換為字串

#define version_major 1

#define version_minor 29

#define version_patch 2

#define stringify(v) stringify_helper(v)

#define stringify_helper(v) #v //see here

#define version_string stringify(uv_version_major) "." \

stringify(uv_version_minor) "." \

stringify(uv_version_patch)

const char* version_string(void)

需要注意其中有兩次巨集轉化過程, 第一次stringify(v) 將數字展開,第二次將數字直接轉變為字串;而不能直接這樣使用:

#define stringify(v)  #v

stringify(version_major)

因為但凡巨集定義裡有用'#'或'##'的地方巨集引數是不會再展開的,即上面的輸出是字串「version_major」

補充@2020.0606 : linux driver 中有乙個巨集定義 __stringify實現了相同的功能;

第二個a##b的作用是將ab連成字串

typedef struct  task_entry_t, bench_entry_t;

#define test_declare(name) \

int run_test_##name(void); // see here

#define test_entry(name) \

,

C 的巨集和 C 的巨集

總結一下c和c 的巨集。大家經常使用的其實都是c中的巨集,但是c 都延續了下來,先回顧一下。define 定義巨集 undef 取消巨集 include 包含標頭檔案 ifdef 如果巨集已經定義,則返回真 ifndef 如果巨集沒有定義,則返回真 if 如果條件為真,則執行下面的 else 與 i...

C語言巨集中的 和 的用法

與 在巨集定義中的 巨集展開 include define f a,b a b define g a a define h a g a int main 巨集展開時 如果巨集定義以 開頭,不展開引數,直接替換。故g f 1,2 f 1,2 f 1,2 如果巨集定義不以 開頭,展開引數,直接替換,由外...

巨集和c 中的inline內聯函式

inline函式是c 引入的機制,目的是解決使用巨集定義的一些缺點。1.為什麼要引入內聯函式 內聯函式的作用 用它替代巨集定義,消除巨集定義的缺點。巨集定義使用預處理器實現,做一些簡單的字元替換因此不能進行引數有效性的檢測。另外它的返回值 不能被強制轉換為可轉換的合適 型別,且c 中引入了類及類的訪...