Je comprends que les compilateurs C ++ ne sont pas compatibles entre eux. Cependant, je n'ai rien trouvé sur ce sujet pour C en particulier. Je sais que la norme C laisse beaucoup de place aux compilateurs pour implémenter les choses comme bon leur semble: par exemple, la taille et l'alignement de la plupart (tous?) Des types de données sont définis par l'implémentation, à l'exception de quelques garanties minimales. Par conséquent, deux compilateurs (ou deux versions du même compilateur) peuvent être en désaccord sur de nombreux détails.
Ai-je raison de penser qu'il n'y a aucune garantie que deux fichiers objets compilés avec des compilateurs différents seront effectivement liés correctement? Par exemple, la taille des pointeurs peut être de 32 bits dans un fichier objet et de 64 bits dans l'autre. Mais si c'est le cas, pourquoi les bibliothèques C sont-elles parfois distribuées sous forme précompilée? Y a-t-il une attente que j'utiliserai le même compilateur qu'eux (par exemple gcc), ou une norme de facto utilisée pour assurer la compatibilité binaire? Et comment les autres langues avec une interface en langue étrangère garantissent-elles que les choses s'aligneront correctement lors de la liaison avec les fichiers d'objets C?