Использования аргументов по умолчанию для указателей в C++ можно продемонстрировать с следующим кодомаргументов по умолчанию для указателя в C++ и смешанного программирования
#include <iostream>
void myfunc_(int var, double* arr = 0) {
if (arr == 0) {
std::cout << "1 arg" << std::endl;
} else {
std::cout << "2 arg" << std::endl;
}
}
int main() {
myfunc(1);
double *arr = new double[2];
myfunc(1, arr);
}
в этом случае выход из программы
1 arg
2 arg
, с другой стороны, если я попытаюсь передать необязательные аргументы из Fortran в C++, это не сработает. Следующий пример кода демонстрирует sutiation
myfunc.cpp
#include <iostream>
extern "C" void myfunc_(int var, double* arr = 0) {
if (arr == 0) {
std::cout << "1 arg" << std::endl;
} else {
std::cout << "2 arg" << std::endl;
}
}
и Fortran основной программы
program main
use iso_c_binding
real*8 :: arr(2)
call myfunc(1)
call myfunc(1, arr)
end program main
и смешанный код (Fortran и C++) могут быть скомпилированы используя следующую команду без какой-либо ошибки
g++ -c myfunc.cpp
gfortran -o main.x myfunc.o main.f90 -lstdc++ -lc++
но программа печатает
2 arg
2 arg
в этом случае. Итак, есть ли решение этой проблемы? Я что-то пропустил здесь? Я думаю, что использование аргументов по умолчанию в смешанном программировании работает не так, как ожидалось, но мне нужно предложение на этом этапе.
Хотя ответ на вопрос не принят, я думаю, что он затрагивает вашу проблему, другими словами, вы не можете иметь функции не-C (такие как параметры по умолчанию) при компиляции/связывании с 'extern C'. Вот несколько способов имитации: http://stackoverflow.com/q/2988038/3093378 – vsoftco
Использование extern «C» позволит компоновщику связать вызов myfunc (1) fortran с функцией с двумя аргументами. Но только 1 поставляется, большое время UB. Вы не можете этого сделать, используйте функцию с другим именем, например myfunc2(). –
@vsoftco Я не согласен с дублированием этого. Проблема может быть решена, просто необязательная часть аргумента должна быть выполнена в Fortran, она поддерживает это. –