可以在C函数指针中放置哪些C++函数?

use*_*370 6 c++ language-binding function-pointers calling-convention extern-c

我有一个C库,它使用函数指针的结构来进行回调.回调将从C代码调用.

extern "C" {
typedef struct callbacks_t {
    void (*foo) (const char*);
    int  (*bar) (int);  
} callbacks_t;
}// extern C
Run Code Online (Sandbox Code Playgroud)

我可以安全地将哪些C++函数放在要从C库调用的函数指针中?静态成员函数?完全指定模板功能?不捕捉Lambdas?

g ++似乎让我使用了上述所有内容,但是当我对C和C++函数使用不同的调用约定和语言绑定时,我质疑安全性.

Mar*_*ork 6

我有一个C库,该库使用函数指针的结构进行回调。回调将从C代码中调用。

AC库仅理解C。因此,您只能传递C明确支持和理解的内容。

由于在C ++中没有任何函数类型的调用约定的定义,因此您不能显式地传回C ++函数。您只能传回C函数(用显式声明的C函数extern "C"),并确保它们兼容。

像所有未定义的行为一样,这似乎可以工作(例如,回传普通的C ++函数或静态成员)。但是,像所有未定义的行为一样,它也可以工作。您只是不能保证它实际上是正确的或可移植的。

extern "C" {
    typedef struct callbacks_t {
        void (*foo) (const char*);
        int  (*bar) (int);  
    } callbacks_t;

    // Any functions you define in here.
    // You can set as value to foo and bar.

}// extern C
Run Code Online (Sandbox Code Playgroud)

我可以安全地将哪些C ++函数放置在要从C库调用的那些函数指针中?

静态成员函数?

不会。但这恰好在许多平台上都可以使用。这是一个常见的错误,会在某些平台上咬人。

完全指定的模板功能?

没有。

不捕获Lambda?

没有。

g ++似乎可以让我使用以上所有内容,

是。但是,假设您要传递到使用C ++编译器构建的对象(这是合法的)。由于C ++代码将使用正确的调用约定。问题是,当您将这些东西传递给C库时(想到的就是pthreads)。