Re: Correct way to provide a C callback function nside C++

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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
>




[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux