A enum nunca deve ser usada em uma API?

Estou usando uma biblioteca C fornecida para mim já compilada. Eu tenho informações limitadas sobre o compilador, versão, opções etc. usadas na compilação da biblioteca. A interface da biblioteca usaenum em estruturas que são passadas e diretamente como parâmetros passados.

A questão é: como posso garantir ou estabelecer que, ao compilar código para usar a biblioteca fornecida, meu compilador usará o mesmo tamanho para aquelesenums? Caso contrário, as estruturas não serão alinhadas e a passagem de parâmetros poderá ser confusa, por exemplo.long vs.int.

Minha preocupação deriva do padrão C99, que afirma que oenum tipo:

deve ser compatível com char, um tipo inteiro assinado ou um tipo inteiro não assinado. A escolha do tipo é definida pela implementação, mas deve ser capaz de representar os valores de todos os membros da enumeração.

Até onde eu sei, desde que o maior valor seja adequado, o compilador pode escolher qualquer tipo que quiser, efetivamente por capricho, potencialmente variando não apenas entre os compiladores, mas com versões diferentes do mesmo compilador e / ou opções do compilador . Ele pode escolher representações de 1, 2, 4 ou 8 bytes, resultando em possíveis incompatibilidades nas estruturas e na passagem de parâmetros. (Também pode escolher assinado ou não assinado, mas não vejo um mecanismo para esse problema neste contexto.)

Estou faltando alguma coisa aqui? Se não estou perdendo algo, isso significa queenum nunca deve ser usado em uma API?

Atualizar:

Sim, estava faltando alguma coisa. Embora a especificação da linguagem não ajude aqui, como observado por @Barmar, a ABI (Application Binary Interface) ajuda. Ou, se não, o ABI é deficiente. oABI para o meu sistema de fato, especifica que umenum deve ser um número inteiro de quatro bytes assinado. Se um compilador não obedece a isso, é um erro. Dado um ABI completo e compiladores compatíveis,enum pode ser usado com segurança em uma API.

questionAnswers(2)

yourAnswerToTheQuestion