我在linux源代码中读到并注意到
等语句if (0) {
....
}
这个魔法是什么? 示例:http://lxr.free-electrons.com/source/arch/x86/include/asm/percpu.h#L132
答案 0 :(得分:8)
在这个特定的宏中,您指的是:
132 if (0) { \
133 pao_T__ pao_tmp__; \
134 pao_tmp__ = (val); \
135 (void)pao_tmp__; \
136 } \
if (0) { ... }
阻止是一种“使用”val
而无需使用的方法。这个代码块的主体将由编译器进行评估,但实际上不会生成任何代码,因为if (0)
应始终被消除 - 它永远不能运行。
请注意,这是一个宏。因此,var
和val
可以是任何类型 - 预处理器不关心。 pao_T__
typedef
为typeof(var)
。作为Andy Shevchenko pointed out,此代码块的存在是为了确保val
和var
类型兼容,方法是创建与var
相同类型的变量,并分配{ {1}}。如果类型不兼容,则此分配将生成编译器错误。
通常,许多Linux内核头文件应该被视为黑魔法。它们是元编程的有趣示例,人们可以使用C预处理器,通常是出于性能的考虑。