Макет памяти структуры зависит от компилятора. Итак, что происходит, когда некоторый код, скомпилированный одним компилятором, использует структуру, сгенерированную кодом, скомпилированным другим компилятором?Передача структуры между кодом, сгенерированным различными компиляторами
Например, у меня есть заголовочный файл, который объявляет структуру somestruct
и функцию, которая возвращает структуру. Один исходный файл определяет эту функцию и компилируется компилятором A
. Другой исходный файл использует функцию и скомпилирован компилятором B
и связан с двоичным кодом другого исходного файла.
Если два компилятора создают два разных макета для somestruct
, то какова структура переменной, возвращаемой функцией? Относится ли он к макету одного компилятора или будет ли ошибка памяти, когда второй исходный файл пытается получить доступ к элементам структуры, возвращенным первым исходным файлом? Это ошибка во время компиляции или времени ссылки?
Если два компилятора генерируют разные макеты, это, вероятно, приведет к повреждению памяти. В общем, однако, компиляторы для одной и той же платформы (то есть,CPU и ОС) имеют тенденцию соответствовать какой-то ABI, поэтому это, как правило, не проблема (остерегайтесь компиляторов Microsoft, тем не менее - они склонны не соблюдать платформу ABIs ... но кто в здравом уме будет использовать инструментальную цепочку Microsoft в любом случае, когда есть альтернативы?) –
@TheParamagneticCroissant Я думаю, что вы получили это назад. Windows - это платформа, и Microsoft определяет платформу и, следовательно, ABI. Когда другие компиляторы отклоняются, это их собственная чертова проблема, потому что * они * не смогут вызывать системные библиотеки и многие сторонние библиотеки. – delnan
@ delnan О, дорогая. Это хорошо и теоретически, но там, где есть компиляторы, возраст старше MSVC & co., И Microsoft идет прямо против хорошо установленных стандартов де-факто ... да, вы можете сказать, что это их право, но приятно ли это делать ? едва. –