fortran-lang / minpack

Modernized Minpack: for solving nonlinear equations and nonlinear least squares problems
https://fortran-lang.github.io/minpack/
Other
97 stars 20 forks source link

Do C callbacks require extern "C"? #78

Open ivan-pi opened 1 year ago

ivan-pi commented 1 year ago

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.

certik commented 1 year ago

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.

ivan-pi commented 1 year ago

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.

certik commented 1 year ago

Ah I see. Looks good to me.