【问题标题】:Is it possible to use a static member function as C callback by C++11 standard?是否可以将静态成员函数用作 C++11 标准的 C 回调?
【发布时间】: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"

标签: c++ c++11


【解决方案1】:

extern "C" 的规范用于控制函数、变量等的名称。但在您的情况下,S::callback 地址在运行时作为参数传递,因此函数的名称不相关,也没有规范必要的。

【讨论】:

  • 这并不完全正确;在极少数情况下,extern "C" 实际上会更改调用约定(我不记得那是哪个特定环境,但我记得存在这样一个奇怪的东西)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多