"extern C++"如何运作?

How does "extern C++" work?

本文关键字:何运作 C++ extern      更新时间:2023-10-16

我跳入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. 可以用这种语法导出所有模板吗?

关于问题3,我的意思是我可以将模板的声明和定义分开,然后为模板生成一个动态链接,而不用使用这个技巧来实际实现吗?

当然,extern "C++"不会在C中工作(尽管一些编译器可能支持它作为扩展)。所以只有在c++中使用才有意义。

这是因为在多个嵌套的外部链接说明符的情况下,最里面的一个生效。因此,如果你有一个头文件被extern "C"包围,你可以使用extern "C++"暂时脱离它,并声明一些c++链接。

当你想为c++库提供一个通用的C接口时,它是最有意义的,但你也想为在c++中实际使用它的人提供c++帮助位。所以你把#ifdef __cplusplus extern "C" { #endif作为一个整体放在标题周围,然后你用extern "C++"来定义这些位,以恢复到c++的链接。

  1. 当周围的代码默认使用C链接时,强制编译器使用c++链接(例如,在C程序中包含winnt.h)。
  2. 是的,它应该是便携的
  3. 是的,他们可以。在c++程序中,"extern"c++"没有多大用处,因为链接无论如何都是"c++"。只有当你的c++代码很有可能被包含在C代码中时,使用extern c++才有意义。