Използвам C библиотека, предоставена ми вече е компилирана. Имам ограничена информация за компилатора, версията, опциите и т.н., използвани при компилирането на библиотеката. Интерфейсът на библиотеката използва enum
както в структури, които се предават, така и директно като предавани параметри.
Въпросът е: как мога да гарантирам или установя, че когато компилирам код за използване на предоставената библиотека, компилаторът ми ще използва същия размер за тези enum
s? Ако не стане, структурите няма да се подредят и предаването на параметър може да бъде объркано, напр. 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
елемент в enum. Помислете за ситуация, в която (продължение) - person JimR   schedule 29.12.2013enum
. Безсмислено, тъй като ABI трябва да гарантира, чеenum
има еднакъв размер в компилаторите. (Въпреки че не знам дали трябва == ще стане във вашия случай. Windows има ли последователен, наложен ABI?) - person Mark Adler   schedule 29.12.2013