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++函数使用不同的调用约定和语言绑定时,我质疑安全性.
我有一个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)。