minpack
minpack copied to clipboard
Do C callbacks require extern "C"?
Assuming the C interface of MINPACK is used in C++ program, should the callback types also have C linkage specified?
extern "C" { // <-- do we need this?
typedef void (*minpack_func)(
int /* n */,
const double* /* x */,
double* /* fvec */,
int* /* iflag */,
void* /* udata */);
} // <-- do we need this?
The last section of this Oracle document, Pointers to Functions as Function Parameters, appears to say that unless the linkage is specified, the following declaration
MINPACK_EXTERN void MINPACK_CALL
minpack_hybrd(
minpack_func /* fcn */,
int /* n */,
double* /* x */,
double* /* fvec */,
...);
assumes the fcn argument will have C++ linkage and not C, like expected by the Fortran interfaces (definitions).
Typically, C and C++ compilers of the same vendor will be binary compatible when it comes to function linkage, but in principle they don't have to be.
Yes, you have to put in extern "C" for C++. You typically put it under defines to only be used in C++ codes, not C.
We have that in MINPACK_EXTERN macro for the procedures, but not for the callback typedefs. According to the Oracle resources, the typedefs should have it too.
Ah I see. Looks good to me.