Я использую библиотеку C, предоставленную мне уже скомпилированной. У меня есть ограниченная информация о компиляторе, версии, параметрах и т.д., Используемых при компиляции библиотеки. Интерфейс библиотеки использует enum
как в структурах, которые передаются, так и непосредственно в качестве переданных параметров.
Вопрос: как я могу заверить или установить, что когда я компилирую код для использования предоставленной библиотеки, мой компилятор будет использовать тот же размер для этих enum
s? Если это не так, структуры не выстраиваются в линию, и передача параметров может быть испорчена, например. long
против int
.
Моя забота проистекает из стандарта C99, в котором говорится, что тип enum
:
должен быть совместим с char, целочисленным типом со знаком или без знака целочисленный тип. Выбор типа определяется реализацией, но должен быть способным представлять значения всех членов перечисление.
Насколько я могу судить, до тех пор, пока самое большое значение подходит, компилятор может выбрать любой тип, который он чертит хорошо радует, эффективно по прихоти, потенциально изменяющийся не только между компиляторами, но и разными версиями одного и того же компилятора и/или компилятора. Он мог выбирать 1, 2, 4 или 8-байтовые представления, что приводило к потенциальной несовместимости в обеих структурах и передаче параметров. (Он также может выбирать подписанный или неподписанный, но я не вижу механизма для этого в этом контексте.)
Я что-то упустил? Если я чего-то не пропущу, значит ли это, что enum
никогда не должно использоваться в API?
Update:
Да, я что-то упустил. Хотя спецификация языка здесь не помогает, как отмечает @Barmar, используется двоичный интерфейс приложения (ABI). Или, если это не так, тогда ABI является недостаточным. ABI для моей системы действительно указывает, что enum
должен быть подписанным четырехбайтовым целым числом. Если компилятор не подчиняется этому, то это ошибка. Учитывая полный ABI и совместимые компиляторы, enum
можно безопасно использовать в API.