"extern C++"如何工作?

Ada*_*dam 23 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];
Run Code Online (Sandbox Code Playgroud)

我想问一下如下问题:

  1. extern "C++"工作怎么样?
  2. 这是GCC中的便携式和Clang吗?
  3. 是否可以使用此语法导出所有模板?

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

Sne*_*tel 23

好吧,extern "C++"当然不会在C中工作(虽然有些编译器可能会支持它作为扩展).所以在C++中使用它才有意义.

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

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

  • ...是?不知道你在做什么. (4认同)
  • Win32 API是winnt.h的源代码,它是一个基于C的API. (2认同)

Ole*_*leg 5

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

  • 很可能这个"extern"C++"`在一个`extern"C"`块中.如果未包括,该函数将尝试具有C链接. (2认同)