C语言联动typedef&模板

时间:2013-10-18 11:07:06

标签: c++ c templates typedef linkage

我知道模板不能出现在extern "C"块中,其原因是实例化模板函数的 name 使用未编码的名称不能出现一次。< / p>

但是,在下面的代码中,函数的名称被破坏(所以应该没有问题,因为每个实例化都有一个唯一的名称)但仍然具有C语言链接的函数类型。我的问题是下面的代码是否格式正确:

extern "C" using fn_type = void();

template<typename T>
fn_type foo;

int main()
{
    fn_type* const p = foo<int>;
    p();
}

编辑:很难通过编译器运行它来测试它是否符合要求,因为GCC,Clang和MSVC不区分C ++和C函数指针类型。

1 个答案:

答案 0 :(得分:1)

对我而言,标准似乎并未100%明确。提到模板和链接的唯一相关部分是C ++ 11,[temp]§4:

  

模板名称具有链接(3.5)。非成员函数模板可以具有内部链接;任何其他模板名称都应具有外部链接。具有内部链接的模板的特化(显式或隐式)与其他翻译单元中的所有特化不同。 模板,模板显式特化(14.7.3)和类模板部分特化不应具有C链接。使用除C或C ++之外的链接规范与任何这些结构有条件地 - 支持,具有实现定义的语义。 [...]

(强调我的)

段落以具有链接的模板名称开头。然后它说“funciton 模板 (not name )可以有内部链接;任何其他模板名称应有外部联系。“

对我来说,这似乎意味着指的是模板的链接是指模板的名称的链接。如果这种解释是正确的,那么你的例子是格式正确的,如粗体部分也适用于模板名称。然后没有什么能阻止函数模板类型具有C链接。

这就是我对标准的解释。