Eu entendo que os compiladores C ++ não são compatíveis entre si. No entanto, não consegui encontrar nada sobre esse tópico em particular para C. Eu sei que o padrão C deixa muito espaço para os compiladores implementarem as coisas da maneira que acharem melhor: por exemplo, o tamanho e o alinhamento da maioria dos tipos de dados (todos?) São definidos pela implementação, exceto por algumas garantias mínimas. Portanto, dois compiladores (ou duas versões do mesmo compilador) podem discordar em vários detalhes.
Estou correto ao pensar que não há garantia de que dois arquivos de objetos compilados com diferentes compiladores realmente sejam vinculados corretamente? Por exemplo, o tamanho dos ponteiros pode ser 32 bits em um arquivo de objeto e 64 bits no outro. Mas, se é assim, por que as bibliotecas C às vezes são distribuídas na forma pré-compilada? Existe uma expectativa de que usarei o mesmo compilador que eles usaram (por exemplo, gcc) ou algum padrão de fato sendo usado para garantir a compatibilidade binária? E como outros idiomas com uma interface de idioma estrangeiro garantem que as coisas estejam alinhadas corretamente ao vincular com arquivos de objeto C?