/* * Getting something that works in C and CPP for an arg that may or may * not be defined is tricky. Here, if we have "#define CONFIG_BOOGER 1" * we match on the placeholder define, insert the "0," for arg1 and generate * the triplet (0, 1, 0). Then the last step cherry picks the 2nd arg (a one). * When CONFIG_BOOGER is not defined, we generate a (... 1, 0) pair, and when * the last step cherry picks the 2nd arg, we get a zero. */ #define __ARG_PLACEHOLDER_1 0, #define config_enabled(cfg) _config_enabled(cfg) #define _config_enabled(value) __config_enabled(__ARG_PLACEHOLDER_##value) #define __config_enabled(arg1_or_junk) ___config_enabled(arg1_or_junk 1, 0) #define ___config_enabled(__ignored, val, ...) val 所以当某变量被定义为 1 的时候则此宏返回 1, 否则,如果没有定义,则此宏返回 0;如果定义为其他值,则编译不过,因为__config_enable()宏只允许传入一个值. 这个宏可以用与在运行时判断某个宏有没有定义(当然,前提是该宏要是定义必须被定义为 1) 即类似: #define TEST 1
a small trick
最新推荐文章于 2025-03-06 09:57:06 发布