【发布时间】:2016-08-24 19:45:24
【问题描述】:
我有一个 C 库,它使用函数指针结构进行回调。回调将从 C 代码中调用。
extern "C" {
typedef struct callbacks_t {
void (*foo) (const char*);
int (*bar) (int);
} callbacks_t;
}// extern C
我可以安全地将哪些类型的 C++ 函数放置在要从 C 库调用的函数指针中?静态成员函数?完全指定的模板函数?非捕获 Lambda?
g++ 似乎让我可以使用以上所有方法,但我质疑 C 和 C++ 函数使用不同调用约定和语言绑定时的安全性。
【问题讨论】:
-
“但我质疑 C 和 C++ 函数使用不同的调用约定和语言绑定时的安全性” 当所有内容都一致编译时,没有任何区别目标环境。
-
静态成员函数、专用模板函数和非捕获 lambda 不能如此正式地给出 extern "C" 调用约定,这是不好的。但实际上它取决于编译器。作为实践中的问题,主要问题不是它不起作用,而是一些编译器会产生关于形式的愚蠢警告。
-
@Cheersandhth.-Alf,没关系。 C 库应该能够毫无问题地调用名称被 C++ 编译器修改的函数。
-
@RSahu:这不是关于名称修改,而是关于调用约定。
-
@RSahu:我从来没有听说过。据报道(当这在 clc++ 中讨论过一次时)发出愚蠢警告的一个编译器是针对 Solaris 的,我相信。所以我认为它与有符号整数的补码或符号和大小表示的可能性属于同一类问题。
标签: c++ function-pointers calling-convention language-binding extern-c