Intereting Posts
Какая часть systemd запускает службу загрузки модhive? Как удалить файл лицензии, когда debian-упаковка с использованием автозапуска automake? Как закрыть все текущие графические программы? Как использовать разрез для разделения по нескольким пробелам? Сделать nslookup использовать определенный интерфейс Приостановить процесс и вернуть его на передний план на отдельном экране в Ubuntu Проблема с доступом к / из разных разделов Debian Jessie с 2 дисплеями Pulseaudio жалуется на отсутствие «org.bluez» и не играет никакого звука. Как исправить? Установить приложение xdg-open по умолчанию для терминальной программы Добавьте разделители математики в икивики и матжакс Как я просматриваю интернет из системы Linux, маскируя ее как систему Windows или OSX? Как настроить интерфейс usb / ethernet в Linux? Время на 3 часа вперед всегда в полночь Как я могу перечислить все файлы, но только в каталогах, у которых нет подкаталогов?

ошибка: типы не могут быть определены в выражениях «sizeof»

Я пытаюсь скомпилировать kernel ​​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));}). Есть ли более простая альтернатива для того же.

Этот макрос пытается выдать ошибку компиляции, если аргумент имеет значение true (не ноль). Это достигается путем определения структуры с битовым полем, длина которого становится отрицательной, если e истинно.

Основываясь на ответах на этот вопрос о Stackoverflow , проблема в том, что хитрость, используемая в макросе, не совместима с C ++, по той причине, которая указана в сообщении об ошибке: в отличие от C, C ++ не позволяет определять struct внутри sizeof .

Ядро Linux использует только C, поэтому они, вероятно, не заботятся о несовместимости с C ++ в заголовках, используемых kernelм.

Ответы на связанный вопрос содержат совместимые с C ++ альтернативы тому же эффекту.