相关疑难解决方法(0)

如何使用模板中的C-linkage创建函数?

在看到SO答案后,我可能有点迟到知道这个标准陈述:

[C++ 11:7.5/1]

具有不同语言链接的两种函数类型是不同的类型,即使它们在其他方面是相同的.

这意味着,给定:

void f1();
extern "C" void f2();
Run Code Online (Sandbox Code Playgroud)

decltype(f1) 是不一样的 decltype(f2)

直到现在我才意识到的一个原因是主要的编译器(例如g ++,clang,vc ++ ......)不遵守这个规则.见现场演示.

但我相信大多数人(包括我)会对当前不符合标准的行为感到高兴.如果编译器遵循标准,许多桥接C和C++的代码将被破坏.

考虑这个例子:

库提供C API:

#ifdef __cplusplus
extern "C" {
#endif
void registerCallbackInC(void(*callback)(void*));
#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)

要在C++中使用库:

void f1(void*)
{
    ...
}

extern "C" void f2(void*)
{
    ...
}

registerCallbackInC(f1); // invalid, f1 has C++ linkage
registerCallbackInC(f2); // OK
Run Code Online (Sandbox Code Playgroud)

要使用registerCallbackInC,callback必须有C-linkage,但是,我们不能使用extern "C"模板:

extern "C"
{
    template<class T>
    void f(void*); // invalid …
Run Code Online (Sandbox Code Playgroud)

c++ templates linkage language-lawyer

5
推荐指数
1
解决办法
1763
查看次数

标签 统计

c++ ×1

language-lawyer ×1

linkage ×1

templates ×1