
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
引数がtrue(0以外)の場合、マクロはコンパイルエラーを生成しようとします。e
これはtrueの場合、長さが負のビットフィールドを持つ構造を定義することによってこれを行います。
以下の回答に基づいてStackoverflowに関するこの質問問題は、単にエラーメッセージに記載されている理由のため、マクロで使用されたトリックがC ++と互換性がないことです。 Cとは異なり、C ++はstruct
内部定義を許可しませんsizeof
。
LinuxカーネルはCのみを使用するため、カーネルで使用されるヘッダファイルのC ++との互換性を気にしないことがあります。
リンクされた質問に対する回答には、同じ効果を持つC ++互換の代替案が含まれています。