On Fri, Jan 27, 2023 at 8:24 AM Pepe via Gcc-help <gcc-help@xxxxxxxxxxx> wrote: > Hi there, > > I’m in an ongoing discussion about whether or not one should use extern > “C” when defining a function that will be used as a callback in a > statically linked C library. For example: > > c_func.h: > // … > void reg_callback(void (*fn)()); > // … > > cpp_impl.cpp: > // … > extern “C” { > #include “c_func.h” > } > > // my callback function with internal linkage > namespace { > > extern “C” { > static void my_callback_A() { > // … > } > } // extern “C” > > void my_callback_B() { > // … > } > > } // namespace > > void do_something() { > reg_callback(my_callback_A); > reg_callback(my_callback_B); > } > > Both callbacks have internal linkage. Both work fine, and something like > my_callback_B is found in lots of code bases. > > In my opinion, using callback B is implementation defined behaviour, > because it is not guaranteed that C and C++ use the same calling > conventions. Therefore a function must adhere to the C calling conventions > to be used as a callback in a C library, which would be callback A. > You can do a callback (using function pointers) in C++ code. https://en.cppreference.com/w/cpp/language/pointer > I’ve been trying to find something definitive for days now, but to no > avail. Now I’m not sure what’s true or not. The counter argument is the > following: The compiler should know reg_callback is a C function and make > sure that a given argument would either be valid or cause a compiler error. > That sounds reasonable, so I would love to know how to do it properly for > future reference. Given we use gcc I was hoping to get a definitive answer > in this mailing list. Thanks a lot! > > Pepe >