我在linux源代码和通知语句中读到了
if (0) {
....
}
Run Code Online (Sandbox Code Playgroud)
这个魔法是什么?示例:http://lxr.free-electrons.com/source/arch/x86/include/asm/percpu.h#L132
在这个特定的宏中,你指的是:
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指出的那样,这个代码块通过创建与其相同类型的变量并分配给它来确保val和var类型兼容.如果类型不兼容,则此分配将生成编译器错误.varval
一般来说,许多Linux内核头文件应该被视为黑魔法.它们是元编程的一个有趣示例,人们可以使用C预处理器,通常是为了性能.
| 归档时间: |
|
| 查看次数: |
90 次 |
| 最近记录: |