minpack icon indicating copy to clipboard operation
minpack copied to clipboard

Do C callbacks require extern "C"?

Open ivan-pi opened this issue 2 years ago • 3 comments
trafficstars

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.

ivan-pi avatar Jul 04 '23 15:07 ivan-pi

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.

certik avatar Jul 04 '23 15:07 certik

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.

ivan-pi avatar Jul 04 '23 15:07 ivan-pi

Ah I see. Looks good to me.

certik avatar Jul 04 '23 15:07 certik