Я понимаю, что компиляторы C ++ не совместимы друг с другом. Однако я не смог найти что-либо по этой теме для C, в частности. Я знаю, что стандарт C оставляет много возможностей для реализации компиляторами, как они считают нужным: например, размер и выравнивание большинства (всех?) Типов данных определяется реализацией, за исключением некоторых минимальных гарантий. Следовательно, два компилятора (или две версии одного и того же компилятора) могут не соглашаться по многим деталям.
Правильно ли я считаю, что нет гарантии, что два объектных файла, скомпилированных с разными компиляторами, действительно будут правильно связываться? Например, размер указателей может быть 32 бита в одном объектном файле и 64 бита в другом. Но если это так, почему библиотеки C иногда распространяются в предварительно скомпилированном виде? Ожидается ли, что я буду использовать тот же компилятор, который они использовали (например, gcc), или какой-то де-факто стандарт, используемый для обеспечения двоичной совместимости? И как другие языки с Интерфейсом Иностранных Языков гарантируют, что все будет правильно выстраиваться при связывании с объектными файлами C?