是否可以在模板中键入一个指向外部的“C”函数类型?

时间:2011-02-01 18:25:11

标签: c++ templates typedef extern

我想将一个公共typedef添加到模板中,以获取指向使用“C”语言链接的函数take-one-argument的指针。

我试过了:

extern "C" {
    template <typename return_t_, typename arg1_t_>
    struct test
    {
        typedef return_t_ (*C_fun1_t)(arg1_t_);
    };
}

template <typename return_t_, typename arg1_t_>
struct test
{
    extern "C" {
        typedef return_t_ (*C_fun1_t)(arg1_t_);
    }
};

template <typename return_t_, typename arg1_t_>
struct test
{
    extern "C" typedef return_t_ (*C_fun1_t)(arg1_t_);
};

没有成功。

我想要完成的是什么?

3 个答案:

答案 0 :(得分:10)

C ++ 03,§7.5p4:

  

链接规范只应在命名空间范围内进行。 ...对于类成员的名称和类成员函数的成员函数类型,将忽略C语言链接。

不幸的是,你在当前的C ++中根本无法做到这一点。这个文本在最新的C ++ 0x草案中没有改变,但是“template typedefs”可能能够实现它。

答案 1 :(得分:1)

考虑typedef的{​​{1}}或STL函数对象...如果您考虑一下,您也无法在extern“C”块中定义模板,原因很明显。

答案 2 :(得分:0)

如果我只是从你的typedef中省略extern "C",那么对我来说似乎一切正常。也就是说,以下编译,链接和运行没有警告,错误或问题:

foo.c的:

#include <stdio.h>
int foo(int x) {
    return printf("%x\n", x);
}

TEST.CPP:

extern "C" int foo(int);

template <typename return_t_, typename arg1_t_>
struct test
{
    typedef return_t_ (*C_fun1_t)(arg1_t_);
    C_fun1_t myFn;
};

int main() {
    test<int, int> t;
    t.myFn = foo;
    return t.myFn(5);
}

对于C ++大师:我不知道C链接与C ++的区别所在。在这样一个简单的例子中是否存在任何隐藏的问题?