如何将成员声明为指向extern“C”函数的指针?

时间:2012-11-03 21:56:19

标签: c++ linkage

我想要声明一个extern“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之间,但编译器拒绝了所有。有什么建议吗?

2 个答案:

答案 0 :(得分: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。我不确定这是否是任何一个编译器中的错误,所以在使用它时要小心。

答案 1 :(得分:0)

你不能声明类似的typedef(从7.5p4开始):

  

链接规范只能在命名空间范围(3.3)中发生。