错误:“sizeof”表达式中可能未定义类型

错误:“sizeof”表达式中可能未定义类型

我尝试编译 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++ 不允许定义structinside sizeof

Linux 内核只使用 C,因此他们可能不关心内核使用的头文件中与 C++ 的不兼容性。

链接问题的答案包含具有相同效果的 C++ 兼容替代方案。

相关内容