Я работаю над небольшой библиотекой Fortran (новый код), которая вызывается из нескольких приложений C/C++. Библиотека такая, что почти каждую подпрограмму можно было вызывать отдельно из приложения. Поэтому мне нужно предоставить интерфейс C для этих подпрограмм.
- Я могу использовать модули, которые очень удобны сами по себе. Но тогда мне нужно либо вручную декодировать искажение имени модуля (что не очень сложно для gfortran, но выглядит плохо), либо использовать предложение
bind(C,name="some_name")
. Последнее приводит к предупреждениям компилятора, например, параметр подпрограммы не был явным образом интероперабельным (например, компилятор хочет, чтобы я заменилdouble precision
наreal(kind=C_DOUBLE)
). И я должен в этом случае заменить почти каждую переменную в библиотеке такими уродливыми объявлениями, что приводит к плохому чтению кода. - Я могу использовать подпрограммы, когда каждый файл в библиотеке состоит из нескольких подпрограмм (я так и делаю сейчас). Явно интерфейсы передаются между ними с помощью
interface ... include "otherfile_h.f90" ... end interface
, что не очень удобно. В этом случае изменение имени довольно просто, и библиотечные подпрограммы можно легко вызывать напрямую из C.
Подход, который я использую (маркер № 2), требует большего набора текста и подвержен ошибкам из-за дублирования определений в исходных/заголовочных файлах. Есть ли лучший способ сохранить чистоту и читаемость исходных текстов с помощью интеллектуального интерфейса C?
real(kind=C_DOUBLE)
прекрасно читается, и мой "ответ" на ваш вопрос Есть ли лучший способ... - Нет. Я бы пошел дальше и заявляют, что программирование НА языке, а не программирование ВОКРУГ языка — это путь к счастью, удовлетворению и успеху. Но обратите внимание, что это всего лишь комментарий, я не предлагаю ответа. - person High Performance Mark   schedule 03.07.2012