【问题标题】:How to declare a member as a pointer to an extern "C" function?如何将成员声明为指向外部“C”函数的指针?
【发布时间】:2012-11-03 21:56:18
【问题描述】:

我正在寻找声明外部“C”函数指针的类型。它是一个成员变量。 this question 中的语法我无法编译。

template<typename Sig> struct extern_c_fp {
    extern "C" typedef typename std::add_pointer<Sig>::type func_ptr_type;
};

我已经尝试将extern "C" 放在两端,在typedeftypename 之间以及typefunc_ptr_type 之间,但是编译器全部拒绝。有什么建议吗?

【问题讨论】:

  • 使用extern "C" 别名模板,这将起作用。 open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1463
  • 顺便说一句,您需要 Sig 才能成为 extern "C"。添加到函数类型的指针没有链接。它是函数类型本身。在形成函数类型时诱导链接。不是在命名现有函数类型时 - 现有类型具有它所具有的链接。
  • liveworkspace.org/code/768027ef00bb0a31e76d8d856ac50801 抱怨少了,但还是有问题。
  • 不幸的是 extern "C" { template&lt;typename T&gt; struct A {}; } 被实现拒绝。他们没有将链接应用到A,而是尝试应用它并违反模板不应具有 C 语言链接的规则。恕我直言,这样的代码是有效的......语言链接不适用于模板,因此模板永远不会有 C 语言链接。这样的代码会很有用!
  • 我在这里遗漏了什么吗?你为什么要这样做?

标签: c++ linkage


【解决方案1】:
extern "C" {
    template<typename R, typename... Args>
    using extern_c_fp = R(*)(Args...);
}

using my_function_ptr = extern_c_fp<void, int, double>;
// returns void, takes int and double

这和你使用的接口不一样,但是可能有办法提取Sig的返回类型和参数类型。

这适用于 clang 3.1。 Xeo 指出it didn’t work in GCC。我不确定这是否是任一编译器的错误,所以使用时要小心。

【讨论】:

    【解决方案2】:

    你不能声明这样的 typedef(从 7.5p4 开始):

    链接规范应仅出现在命名空间范围 (3.3) 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多