ISO_C_BINDING между разными поставщиками Fortran и C

Поддерживается ли концепция модуля Fortran ISO_C_BINDING поставщиками компиляторов C/C++? Например, размер C/C++ int может варьироваться между компиляторами разных производителей. Итак, с модулем ISO_C_BINDING мы знаем, что тип Fortran C_INT составляет 4 байта; а не просто иметь вид 4. Но мы до сих пор не знаем размер int вообще в C/C++. Я прав? Возможно, есть стандартный C/C++ ISO_C_BINDING-совместимый переключатель компилятора?


person user2023370    schedule 12.02.2012    source источник
comment
Какое отношение это имеет к C++?   -  person Puppy    schedule 12.02.2012
comment
используя «extern C», вы можете использовать ISO_C_Binding для вызова C++ из Fortran.   -  person M. S. B.    schedule 12.02.2012


Ответы (2)


Насколько я знаю, стандарт требует соответствия типов только в одной и той же цепочке инструментов. Таким образом, вам лучше использовать C-компилятор того же производителя. Я думаю, стандарт ничего не говорит о размерах видов C_.

Правка: только что посмотрел в стандарте, там всегда упоминается сопутствующий C-компилятор.

person haraldkl    schedule 12.02.2012
comment
Это кажется очень вероятным. В конце концов, я бы не стал связывать библиотеки Fortran от разных поставщиков. - person user2023370; 12.02.2012
comment
+1: К сожалению, даже файлы .mod, генерируемые разными компиляторами fortran, несовместимы; без разработки конкретного бинарного интерфейса для разных архитектур нет реального способа обеспечить совместимость между компиляторами. - person Jonathan Dursi; 12.02.2012
comment
Действительно, между модулями Fortran нет совместимости, однако я довольно регулярно использую объекты GCC по ISO-C-Binding с различными другими компиляторами Fortran от разных поставщиков (в основном Intel), и в большинстве случаев это взаимодействие, кажется, работает, хотя есть гарантия... - person haraldkl; 12.02.2012
comment
Поставщик компилятора может гарантировать совместимость только между своими компиляторами Fortran и C. Какой-то другой компилятор может использовать другой интерфейс, который может даже меняться с версиями. Тем не менее, мой опыт такой же, как у haraldkl, что ifort и gcc прекрасно сочетаются. - person M. S. B.; 12.02.2012

Большинство операционных систем предоставляют C API, что, очевидно, подразумевает наличие стандартного C ABI на этой платформе. Обычно компиляторы C используют этот ABI, но могут быть некоторые особенности (например, стандартным соглашением о вызовах для Windows API является stdcall, который не поддерживает функции с переменным числом переменных, поэтому существует второе важное соглашение о вызовах, называемое cdecl).

Ситуация с C++ не столь однозначна: большинство операционных систем не предоставляют C++ API (есть исключения, такие как BeOS/Haiku), поэтому поставщики компиляторов могут делать все, что считают нужным, что приводит к несовместимости между компиляторами из разных поставщиков, а иногда даже между разными версиями одного и того же компилятора. Я думаю, по крайней мере, GCC стабилизировал свой C++ ABI, но я понятия не имею об общей ситуации...

person Christoph    schedule 12.02.2012
comment
Спасибо. В каком смысле операционная система раскрывает свой C ABI? - person user2023370; 12.02.2012
comment
@ user643722: нет смысла иметь API ОС без ABI - как бы вы вызывали функцию API, если у вас нет концепции вызова соглашений и типов аргументов? Помимо встроенного кода, компилятор C, который не может взаимодействовать с ОС, не очень полезен, поэтому он должен поддерживать ABI ОС и почти всегда будет использовать этот ABI для всего своего кода. - person Christoph; 13.02.2012
comment
Спасибо. Значит, стандартная библиотека C рассматривается как часть ОС? Означает ли это, скажем, что Windows не предоставляет C API? - person user2023370; 16.02.2012
comment
@user643722 user643722: стандартная библиотека C может быть частью API ОС или (частый случай) реализована поверх него; в Windows (которая имеет C API) она доступна как отдельная библиотека, доступная в разных версиях (см. msdn.microsoft.com/en-us/library/abx4dbyh%28v=vs.80%29.aspx ); стандарт C накладывает некоторые ограничения на возможные ABI (например, минимальную ширину целочисленных типов), но многое оставляет за «реализацией», что является общим термином, охватывающим такие вещи, как архитектура, ОС и компилятор. - person Christoph; 16.02.2012