エラー: '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

引数がtrue(0以外)の場合、マクロはコンパイルエラーを生成しようとします。eこれはtrueの場合、長さが負のビットフィールドを持つ構造を定義することによってこれを行います。

以下の回答に基づいてStackoverflowに関するこの質問問題は、単にエラーメッセージに記載されている理由のため、マクロで使用されたトリックがC ++と互換性がないことです。 Cとは異なり、C ++はstruct内部定義を許可しませんsizeof

LinuxカーネルはCのみを使用するため、カーネルで使用されるヘッダファイルのC ++との互換性を気にしないことがあります。

リンクされた質問に対する回答には、同じ効果を持つC ++互換の代替案が含まれています。

おすすめ記事