" extern C ++"工作?

时间:2014-06-15 12:57:15

标签: c++ templates extern

我跳进winnt.h,我发现代码如下:

extern "C++" // templates cannot be declared to have 'C' linkage
template <typename T, size_t N>
char (*RtlpNumberOf( UNALIGNED T (&)[N] ))[N];

我想提问如下:

  1. extern "C++"如何运作?
  2. 在GCC和Clang中是否便携?
  3. 是否可以使用此语法导出所有模板?

  4. 对于问题3,我的意思是我可以将模板的declearation和定义分开,然后为模板生成动态链接,而不使用这个技巧实际给出实现吗?

2 个答案:

答案 0 :(得分:23)

嗯,extern "C++"当然不会在C中工作(虽然有些编译器可能支持它作为扩展)。因此,只有在C ++中使用它才有意义。

那是因为在多个嵌套的extern链接说明符的情况下,最里面的一个生效。因此,如果您有一个用extern "C"包围的头文件,您可以使用extern "C++"暂时中断它并使用C ++链接声明某些内容。

当您想为C ++库提供通常的C接口时,它最有意义,但您也想为在C ++中实际使用它的人提供C ++帮助程序位。因此,您将#ifdef __cplusplus \ extern "C" { \ #endif作为整体放在标题周围,然后ifdef-in使用extern "C++"来恢复到C ++链接。

答案 1 :(得分:5)

  1. 当周围代码默认使用C链接时(例如,在C程序中包含winnt.h),它强制编译器使用C ++链接。
  2. 是的,它应该是便携式的。
  3. 是的,他们可以。 对于&#34; extern&#34; C ++&#34;&#34;没有多大用处。在C ++程序中,因为链接是&#34; C ++&#34;无论如何。使用&#34; extern&#34; C ++&#34;&#34;是有道理的。只有在您的C ++代码很可能被包含在C代码中时才会这样。
相关问题