Czy enum nigdy nie powinien być używany w interfejsie API?

Używam udostępnionej mi biblioteki C. Mam ograniczone informacje o kompilatorze, wersji, opcjach itp. Używanych podczas kompilacji biblioteki. Interfejs biblioteki używaenum zarówno w strukturach, które są przekazywane, jak i bezpośrednio jako parametry przekazane.

Pytanie brzmi: jak mogę zapewnić lub ustalić, kiedy kompiluję kod, aby użyć dostarczonej biblioteki, że mój kompilator użyje tego samego rozmiaru dla tychenums? Jeśli tak się nie stanie, struktury nie będą ustawione w linii, a przekazywanie parametrów może być pomieszane, np.long vs.int.

Moje obawy wynikają ze standardu C99, który stwierdza, żeenum rodzaj:

musi być zgodny z char, typem podpisanej liczby całkowitej lub liczbą całkowitą bez znaku. Wybór typu jest zdefiniowany w implementacji, ale powinien być w stanie reprezentować wartości wszystkich członków wyliczenia.

O ile wiem, tak długo, jak najlepiej pasuje, kompilator może wybrać dowolny typ, który dobrze mu się podoba, skutecznie pod wpływem kaprysu, potencjalnie różniącego się nie tylko między kompilatorami, ale różnymi wersjami tego samego kompilatora i / lub opcji kompilatora . Może wybrać reprezentacje 1, 2, 4 lub 8-bajtowe, powodując potencjalne niezgodności w obu strukturach i przekazywaniu parametrów. (Może również wybrać podpisane lub niepodpisane, ale nie widzę mechanizmu, który stanowiłby problem w tym kontekście.)

Czy coś mi umyka? Jeśli czegoś nie brakuje, czy to znaczyenum nigdy nie powinien być używany w API?

Aktualizacja:

Tak, czegoś mi brakowało. Podczas gdy specyfikacja języka nie pomaga tutaj, jak zauważył @Barmar, robi to Application Binary Interface (ABI). A jeśli nie, to ABI jest niedostateczne. TheABI dla mojego systemu rzeczywiście określa, żeenum musi być podpisaną czterobajtową liczbą całkowitą. Jeśli kompilator nie przestrzega tego, jest to błąd. Biorąc pod uwagę kompletne ABI i zgodne kompilatory,enum mogą być bezpiecznie używany w API.

questionAnswers(2)

yourAnswerToTheQuestion