오류: '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++ 호환 대안이 포함되어 있습니다.

관련 정보