RosettaCodeData/Task/Call-a-foreign-language-fun.../C++/call-a-foreign-language-fun...

43 lines
1.4 KiB
C++

#include <cstdlib> // for C memory management
#include <string> // for C++ strings
#include <iostream> // for output
// C functions must be defined extern "C"
extern "C" char* strdup1(char const*);
// Fortran functions must also be defined extern "C" to prevent name
// mangling; in addition, all fortran names are converted to lowercase
// and get an undescore appended. Fortran takes all arguments by
// reference, which translates to pointers in C and C++ (C++
// references generally work, too, but that may depend on the C++
// compiler)
extern "C" double multiply_(double* x, double* y);
// to simplify the use and reduce the probability of errors, a simple
// inline forwarder like this can be used:
inline double multiply(double x, double y)
{
return multiply_(&x, &y);
}
int main()
{
std::string msg = "The product of 3 and 5 is ";
// call to C function (note that this should not be assigned
// directly to a C++ string, because strdup1 allocates memory, and
// we would leak the memory if we wouldn't save the pointer itself
char* msg2 = strdup1(msg.c_str());
// C strings can be directly output to std::cout, so we don't need
// to put it back into a string to output it.
std::cout << msg2;
// call the FORTRAN function (through the wrapper):
std::cout << multiply(3, 5) << std::endl;
// since strdup1 allocates with malloc, it must be deallocated with
// free, not delete, nor delete[], nor operator delete
std::free(msg2);
}