2016-10-17 5 views
7

Как я могу ссылаться на функцию Fortran в заголовке C++, который использует необязательные аргументы? Будет ли у меня прототип в заголовке для каждой возможной комбинации вызовов? Или это даже возможно?Вызов подпрограмм Fortran с необязательными аргументами из C++

Например, Fortran:

subroutine foo(a, b, c) bind(c) 
    real, intent(in), optional :: a, b, c 
    ... 
end subroutine foo 

ответ

10

Это не представляется возможным, по крайней мере переносимым, если вы сделаете подпрограмму bind(C).

Как только вы сделаете это bind(C), это просто указание указателя, который может быть NULL на стороне C.

subroutine foo(a, b, c) bind(C, name="foo") 
    real, intent(in), optional :: a, b, c 
    ... 
end subroutine foo 

(для большей мобильности real(c_float) от iso_c_binding модуля следует использовать, но несколько по касательной к этому вопросу)

В C (++)

extern "C"{ 
    void foo(float *a, float *b, float *c); 
} 

foo(&local_a, NULL, NULL); 

, а затем вы можете создайте функцию C++, которая вызывает foo и которая использует необязательные параметры в стиле C++.

Эта возможность позволила в Fortran в технической спецификации ISO/IEC TS 29113: 2012 по дальнейшей совместимости Fortran с С.

+0

Действительно, это не будет в любом месте без привязки (с). Благодаря! – DavidH