Как размер перечисления по умолчанию (короткий или короткий) определяется параметрами конфигурации gcc? - PullRequest
0 голосов
/ 24 января 2019

Я попробовал некоторые компиляторы 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?Или все это жестко закодированная магия, разбросанная по всему дереву-источнику?

1 Ответ

0 голосов
/ 24 января 2019

В руководстве по gcc найдите поведение, определяемое реализацией. Глава 4.9 .

Целочисленный тип, совместимый с каждым перечисленным типом (C90 6.5.2.2, C99 и C11 6.7.2.2) .

Обычно типом является unsigned int, если в перечислении нет отрицательных значений, в противном случае int. Если указано -fshort-enums, то при наличии отрицательных значений это первое из signed char, short и int, которое может представлять все значения, в противном случае это первое из unsigned char, unsigned short и unsigned int, который может представлять все значения.

Для некоторых целей -fshort-enums является значением по умолчанию; это определяется ABI.

Часть курсив цитируется из поведения, определенного реализацией стандарта C. Как видите, тип является адаптивным в зависимости от того, какие константы перечисления существуют. Он не обязательно должен иметь одинаковый размер в вашей программе для разных типов enum.

Настройки оптимизации могут иметь значение, поскольку 4 байта enum могут быть быстрее, чем 1 байтовое перечисление на некоторых машинах.

...