Я использую уже скомпилированную библиотеку C, предоставленную мне. У меня ограниченная информация о компиляторе, версии, опциях и т. д., использованных при компиляции библиотеки. Интерфейс библиотеки использует enum
как в передаваемых структурах, так и непосредственно в качестве передаваемых параметров.
Вопрос в следующем: как я могу гарантировать или установить, что при компиляции кода для использования предоставленной библиотеки мой компилятор будет использовать тот же размер для этих enum
? Если это не так, структуры не будут выстраиваться, и передача параметров может быть перепутана, например. long
против int
.
Меня беспокоит стандарт C99, в котором говорится, что тип enum
:
должен быть совместим с char, целочисленным типом со знаком или целочисленным типом без знака. Выбор типа определяется реализацией, но он должен быть способен представлять значения всех членов перечисления.
Насколько я могу судить, до тех пор, пока подходит наибольшее значение, компилятор может выбрать любой тип, который ему чертовски нравится, фактически по прихоти, потенциально различаясь не только между компиляторами, но и разными версиями одного и того же компилятора и / или параметров компилятора. . Он мог выбрать 1-, 2-, 4- или 8-байтовые представления, что приводило к потенциальной несовместимости как в структурах, так и в передаче параметров. (Он также может выбрать подписанный или неподписанный, но я не вижу механизма, в котором это может быть проблемой в этом контексте.)
Я что-то упустил здесь? Если я ничего не упускаю, значит ли это, что enum
никогда не следует использовать в API?
Обновление:
Да, я что-то упустил. Хотя спецификация языка здесь не помогает, как отмечает @Barmar, двоичный интерфейс приложения (ABI) помогает. Или, если это не так, то ABI несовершенен. ABI для моей системы действительно указывает, что enum
должен быть подписанным четырехбайтовое целое. Если компилятор этому не подчиняется, то это ошибка. При наличии полного ABI и совместимых компиляторов enum
можно безопасно использовать в API.
float
,int
и т. д.? - person dreamlax   schedule 28.12.2013enum
в данной среде. - person Mark Adler   schedule 28.12.2013xxLastValue=-1L; /* force int size */
. Всегда задавался вопросом об этом, но это было бы причиной. - person Jongware   schedule 28.12.2013ENUM_FORCE_SIZE_16 = 0xFFFF
в перечислении. Подумайте о ситуации, когда (продолжение) - person JimR   schedule 29.12.2013enum
. Бессмысленно, поскольку ABI должен гарантировать, чтоenum
имеет одинаковый размер для всех компиляторов. (Хотя я не знаю, будет ли should == в вашем случае. Есть ли в Windows последовательный принудительный ABI?) - person Mark Adler   schedule 29.12.2013