【发布时间】:2014-08-26 10:26:40
【问题描述】:
考虑在 C 库中定义的以下函数:
void f(void (*callback)(int)) { callback(0); }
将从定义 callback() 的 C++11 程序调用,如下所示:
struct S {
static void S::callback(int) noexcept {}
};
f(&S::callback);
大多数编译器可能会在没有任何警告的情况下编译上述内容,但是,我的问题是,如果严格来说,我必须将回调声明为(一个免费的)extern "C" 函数以完全符合 C++11 标准。
【问题讨论】:
-
指向静态成员函数的指针可以用作C函数指针。
-
extern "C"是必要的,因为它使 C++ 链接器查找函数的 C 符号,而不是函数的 C++ 名称损坏符号。由于这里不处理函数名,而是函数实际地址,所以不需要extern "C"