C++ C语言链接类型def&;模板

C++ C语言链接类型def&;模板,c++,c,templates,typedef,linkage,C++,C,Templates,Typedef,Linkage,我知道模板不能出现在extern“C”块中,原因是实例化模板函数的名称不能使用非混合名称出现一次 但是,在下面的代码中,函数的名称被破坏了(因此应该没有问题,因为每个实例化都有一个唯一的名称),但仍然具有带有C语言链接的函数类型。我的问题是下面的代码是否格式正确: extern "C" using fn_type = void(); template<typename T> fn_type foo; int main() { fn_type* const p = foo&

我知道模板不能出现在
extern“C”
块中,原因是实例化模板函数的名称不能使用非混合名称出现一次

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

extern "C" using fn_type = void();

template<typename T>
fn_type foo;

int main()
{
    fn_type* const p = foo<int>;
    p();
}
extern“C”使用fn_type=void();
模板
fn_型foo;
int main()
{
fn_类型*常数p=foo;
p();
}

编辑:很难通过编译器来验证它是否符合,因为GCC、Clang和MSVC没有区分C++和C函数指针类型。

< P> >,对我来说,标准似乎不太清楚。提到模板和链接的唯一相关部分是C++11、[temp]§4:

模板名称具有链接(3.5)。非成员函数模板可以有内部链接;任何其他模板名称应具有外部链接。具有内部链接的模板的专门化(显式或隐式)不同于其他翻译单元中的所有专门化<强>模板、模板显式专用化(147.3)和类模板部分专用化不具有C链接。< /强>使用C或C++的链接规范与这些结构中的任何一种的使用是有条件支持的,并带有实现定义的语义。[……]

(强调矿山)

段落以具有链接的模板名称开头。然后它说“函数模板
(不是
名称
可以有内部链接;任何其他模板名称都应该有外部链接。”

对我来说,这似乎意味着引用模板的链接引用模板名称的链接。如果这种解释是正确的,那么您的示例是格式良好的,因为粗体部分也适用于模板名称。那么没有什么可以阻止函数模板类型使用C链接


这就是我对标准的解释。

对我来说,标准在这方面似乎不是100%清楚。提到模板和链接的唯一相关部分是C++11、[temp]§4:

模板名称具有链接(3.5)。非成员函数模板可以有内部链接;任何其他模板名称应具有外部链接。具有内部链接的模板的专门化(显式或隐式)不同于其他翻译单元中的所有专门化<强>模板、模板显式专用化(147.3)和类模板部分专用化不具有C链接。< /强>使用C或C++的链接规范与这些结构中的任何一种的使用是有条件支持的,并带有实现定义的语义。[……]

(强调矿山)

段落以具有链接的模板名称开头。然后它说“函数模板
(不是
名称
可以有内部链接;任何其他模板名称都应该有外部链接。”

对我来说,这似乎意味着引用模板的链接引用模板名称的链接。如果这种解释是正确的,那么您的示例是格式良好的,因为粗体部分也适用于模板名称。那么没有什么可以阻止函数模板类型使用C链接


<>这就是我如何解释标准。

那么,你想用C编译器编译C++代码吗?还是什么?@Bof thefnћ我想把一些函数传递给一个C函数,该函数显然需要
extern“C”
函数指针。@Angew
extern“C”
块将名称和类型合并在一起。模板函数不能在
extern“C”
块中声明,因为每个实例的名称都是相同的。然而,在
模板中,fn_类型foo名称被损坏(因此应该没有问题,因为每个实例化都有一个唯一的名称),但是类型仍然应该有C语言链接。这个网站上有一个很好的答案,解释了语言链接如何独立影响名称和类型之间的区别,但我很难找到它。@Angew我打错了。请再次阅读评论:P.so,你想用C编译器编译C++代码吗?还是什么?@Bof thefnћ我想把一些函数传递给一个C函数,该函数显然需要
extern“C”
函数指针。@Angew
extern“C”
块将名称和类型合并在一起。模板函数不能在
extern“C”
块中声明,因为每个实例的名称都是相同的。然而,在
模板中,fn_类型foo名称被损坏(因此应该没有问题,因为每个实例化都有一个唯一的名称),但是类型仍然应该有C语言链接。这个网站上有一个很好的答案,解释了语言链接如何独立影响名称和类型之间的区别,但我很难找到它。@Angew我打错了。请再读一遍评论:P。