![错误:“sizeof”表达式中可能未定义类型](https://linux22.com/image/134985/%E9%94%99%E8%AF%AF%EF%BC%9A%E2%80%9Csizeof%E2%80%9D%E8%A1%A8%E8%BE%BE%E5%BC%8F%E4%B8%AD%E5%8F%AF%E8%83%BD%E6%9C%AA%E5%AE%9A%E4%B9%89%E7%B1%BB%E5%9E%8B.png)
我尝试编译 linux 内核版本 4.14.41 并收到以下错误:
./arch/x86/include/asm/acpi.h: In function ‘void arch_acpi_set_pdc_bits(u32*)’:
./include/linux/build_bug.h:30:45: error: types may not be defined in ‘sizeof’ expressions
#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:(-!!(e)); }))
^
./arch/x86/include/asm/required-features.h:110:29: note: in expansion of macro ‘BUILD_BUG_ON_ZERO’
#define REQUIRED_MASK_CHECK BUILD_BUG_ON_ZERO(NCAPINTS != 19)
^~~~~~~~~~~~~~~~~
./arch/x86/include/asm/cpufeature.h:84:5: note: in expansion of macro ‘REQUIRED_MASK_CHECK’
REQUIRED_MASK_CHECK || \
^~~~~~~~~~~~~~~~~~~
./arch/x86/include/asm/cpufeature.h:111:32: note: in expansion of macro ‘REQUIRED_MASK_BIT_SET’
(__builtin_constant_p(bit) && REQUIRED_MASK_BIT_SET(bit) ? 1 : \
^~~~~~~~~~~~~~~~~~~~~
./arch/x86/include/asm/acpi.h:118:6: note: in expansion of macro ‘cpu_has’
if (cpu_has(c, X86_FEATURE_EST))
我想知道错误是什么意思以及 sizeof(struct { int:(-!!(e)); }) 返回什么。有没有更简单的替代方案。
答案1
如果参数为真(非零),该宏会尝试产生编译错误。它通过定义一个带有位字段的结构来实现这一点,如果e
为真,则该位字段的长度变为负数。
基于以下答案Stackoverflow 上的这个问题,问题只是宏中使用的技巧与 C++ 不兼容,这正是错误消息中所述的原因:与 C 不同,C++ 不允许定义struct
inside sizeof
。
Linux 内核只使用 C,因此他们可能不关心内核使用的头文件中与 C++ 的不兼容性。
链接问题的答案包含具有相同效果的 C++ 兼容替代方案。