今天的是Python第三話,前面的知識點給大家放在上面了,零基礎的小伙伴可以自己動手領取,學好Python的基礎知識對我們後期 去實現Python案例幫助很大,知其然才能更好解決問題,話不多說,直接開始了。 函數 Python學習交流Q群:906715085#### print(" 定義函數 "); ...
閱讀某項目時,遇到了以下兩個神奇的巨集用法
IFDEF(CONFIG_DEVICE, init_device());
MUXDEF(CONFIG_TRACE, "ON", "OFF")
顧名思義,第一個的意思就是如果定義了CONFIG_DEVICE
巨集才執行後面的函數調用,第二個的含義則是如果定義了CONFIG_TRACE
巨集則為"ON"
,否則為"OFF"
。
大家可以思考思考,這樣的巨集你們會怎麼實現呢?
Hint:並不簡單哦,會用到不少巨集定義的技巧。(如果你有簡單的方法請一定留言告訴我!)
點擊查看解答
// macro concatenation
#define concat_temp(x, y) x ## y
#define concat(x, y) concat_temp(x, y)
// macro testing
// See https://stackoverflow.com/questions/26099745/test-if-preprocessor-symbol-is-defined-inside-macro
#define CHOOSE2nd(a, b, ...) b
#define MUX_WITH_COMMA(contain_comma, a, b) CHOOSE2nd(contain_comma a, b)
#define MUX_MACRO_PROPERTY(p, macro, a, b) MUX_WITH_COMMA(concat(p, macro), a, b)
// define placeholders for some property
#define __P_DEF_0 X,
#define __P_DEF_1 X,
// define some selection functions based on the properties of BOOLEAN macro
#define MUXDEF(macro, X, Y) MUX_MACRO_PROPERTY(__P_DEF_, macro, X, Y)
// simplification for conditional compilation
#define __IGNORE(...)
#define __KEEP(...) __VA_ARGS__
// keep the code if a boolean macro is defined
#define IFDEF(macro, ...) MUXDEF(macro, __KEEP, __IGNORE)(__VA_ARGS__)
解釋每一個巨集很枯燥,不如讓做一個人形預處理器,直接針對第一個巨集用法對其進行展開(第二個巨集的用法包含在第一個之中)
// For CONFIG_DEVICE not defined
IFDEF(CONFIG_DEVICE, init_device());
MUXDEF(CONFIG_DEVICE, __KEEP, __INGORE)(init_device());
MUX_MACRO_PROPERTY(__P_DEF_, CONFIG_DEVICE, __KEEP, __INGORE)(init_device());
MUX_WITH_COMMA(concat(__P_DEF_, CONFIG_DEVICE), __KEEP, __INGORE)(init_device());
MUX_WITH_COMMA(__P_DEF_CONFIG_DEVICE, __KEEP, __INGORE)(init_device());
CHOOSE2nd(__P_DEF_CONFIG_DEVICE __KEEP, __INGORE)(init_device());
註意以上展開過程保留了CONFIG_DEVICE,如果其定義為1或0,則繼續展開可以得到
CHOOSE2nd(X, __KEEP, __INGORE)(init_device());
__KEEP(init_device());
init_device();
如果其沒有定義則該語句直接變成了一條空語句。
怎麼樣是不是很神奇呢?
原文鏈接:https://www.cnblogs.com/zhangyi1357/p/16192431.html
轉載請註明出處!