c - 以零为条件的 If 语句

标签 c linux-kernel

我正在阅读 linux 源代码和注意语句,如

if (0) {
....
}

这是什么魔法? 示例: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         }                                                               \

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

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

总的来说,Linux 内核的很多头文件应该被认为是黑魔法。它们是一个有趣的元编程示例,人们可以使用 C 预处理器进行元编程,通常是为了提高性能。

关于c - 以零为条件的 If 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29020617/

相关文章:

c - pthreads:以编程方式收集有关在不同状态下花费的时间的信息?

c - MISRA 是否检查数组索引是否越界?

c - 如何创建自己的 sysctl 参数

android - Linux 内核 vanilla 的分支 3.x 在 Android 下无法运行——2.6 可以

linux - 内核初始化期间崩溃(模块 insmod)

c - 为什么 syslog.h 会跳过我的 C 程序中的日志消息?

谁能确认我(欧拉法)对这些常微分方程的实现?

c++ - C和C++中函数赋值给变量的区别

c - 使用 pte_map_offset 映射页表

linux - 为什么要在保护模式下启用 A20 线?