Jon*_*art 8

在这个特定的宏中,你指的是:

132         if (0) {                                                        \
133                 pao_T__ pao_tmp__;                                      \
134                 pao_tmp__ = (val);                                      \
135                 (void)pao_tmp__;                                        \
136         }                                                               \
Run Code Online (Sandbox Code Playgroud)

if (0) { ... }块是"使用"的方式val,而不实际使用它.这个代码块的主体将由编译器进行评估,但实际上不会生成任何代码,因为if (0)应始终将其删除 - 它永远不能运行.

请注意,这是一个宏.因此,var并且val可以是任何类型 - 预处理器不关心.pao_T__typedef编辑typeof(var).正如Andy Shevchenko指出的那样,这个代码块通过创建与其相同类型的变量并分配给它来确保valvar类型兼容.如果类型不兼容,则此分配将生成编译器错误.varval

一般来说,许多Linux内核头文件应该被视为黑魔法.它们是元编程的一个有趣示例,人们可以使用C预处理器,通常是为了性能.