如果以ZERO作为条件的声明

时间:2015-03-12 21:33:18

标签: c linux-kernel

我在linux源代码中读到并注意到

等语句
if (0) {
....
}

这个魔法是什么? 示例:http://lxr.free-electrons.com/source/arch/x86/include/asm/percpu.h#L132

1 个答案:

答案 0 :(得分:8)

在这个特定的中,您指的是:

132         if (0) {                                                        \
133                 pao_T__ pao_tmp__;                                      \
134                 pao_tmp__ = (val);                                      \
135                 (void)pao_tmp__;                                        \
136         }                                                               \

if (0) { ... }阻止是一种“使用”val而无需使用的方法。这个代码块的主体将由编译器进行评估,但实际上不会生成任何代码,因为if (0)应始终被消除 - 它永远不能运行。

请注意,这是一个宏。因此,varval可以是任何类型 - 预处理器不关心。 pao_T__ typedeftypeof(var)。作为Andy Shevchenko pointed out,此代码块的存在是为了确保valvar类型兼容,方法是创建与var相同类型的变量,并分配{ {1}}。如果类型不兼容,则此分配将生成编译器错误。

通常,许多Linux内核头文件应该被视为黑魔法。它们是元编程的有趣示例,人们可以使用C预处理器,通常是出于性能的考虑。