Я попробовал некоторые компиляторы gcc, чтобы увидеть, является ли размер перечисления по умолчанию коротким (по крайней мере один байт, как принудительно с -fshort-enums
) или коротким (по крайней мере 4 байта, как принудительно с -fno-short-enums
):
user@host:~$ echo '_Static_assert(4 == sizeof(enum{E}), "enum size is not 4");' | x86_64-linux-gnu-gcc -fsyntax-only -xc - && echo "OK, enum size is 4 on x86_64-linux-gnu"
OK, enum size is 4 on x86_64-linux-gnu
user@host:~$ echo '_Static_assert(4 == sizeof(enum{E}), "enum size is not 4");' | arm-linux-gnueabihf-gcc -fsyntax-only -xc - && echo "OK, enum size is 4 on arm-linux-gnueabihf"
OK, enum size is 4 on arm-linux-gnueabihf
user@host:~$ echo '_Static_assert(4 == sizeof(enum{E}), "enum size is not 4");' | /opt/Atollic_TrueSTUDIO_for_STM32_x86_64_9.1.0/ARMTools/bin/arm-atollic-eabi-gcc -fsyntax-only -xc -
<stdin>:1:1: error: static assertion failed: "enum size is not 4"
user@host:~$ echo '_Static_assert(4 == sizeof(enum{E}), "enum size is not 4");' | /opt/Atollic_TrueSTUDIO_for_STM32_x86_64_9.1.0/ARMTools/bin/arm-atollic-eabi-gcc -fno-short-enums -fsyntax-only -xc - && echo "OK, enum size is 4 on arm-atollic-eabi with -fno-short-enums"
OK, enum size is 4 on arm-atollic-eabi with -fno-short-enums
Как вы можете видеть, short - это значение по умолчанию для встроенных целей, в то время как no-short - значение по умолчанию для размещенных платформ.Это имеет смысл для улучшения бинарной совместимости на размещенных платформах.Теперь:
Какое правило говорит мне, будут ли enums короткими в зависимости от параметров конфигурации при сборке gcc и где это задокументировано?
Редактировать:
Как указано в ответе Лундина, руководство gcc гласит, что
Для некоторых целей -fshort-enums
является значением по умолчанию;это определяется ABI.
Мой вопрос: Как зависит от ABI и где это задокументировано?Содержат ли источники gcc своего рода базу данных, которая сопоставляет архитектуры (например, arm-linux-gnueabihf) с ABI, и какую-то базу данных, в которой указываются все параметры (например, короткие перечисления или нет-короткие перечисления) для каждого ABI?Или все это жестко закодированная магия, разбросанная по всему дереву-источнику?