"extern C++"如何运作?
How does "extern C++" work?
我跳入winnt.h
,我发现代码如下:
extern "C++" // templates cannot be declared to have 'C' linkage
template <typename T, size_t N>
char (*RtlpNumberOf( UNALIGNED T (&)[N] ))[N];
我想问以下问题:
-
extern "C++"
是如何工作的? - 在GCC和Clang之间是可移植的吗?
- 可以用这种语法导出所有模板吗?
关于问题3,我的意思是我可以将模板的声明和定义分开,然后为模板生成一个动态链接,而不用使用这个技巧来实际实现吗?
当然,extern "C++"
不会在C中工作(尽管一些编译器可能支持它作为扩展)。所以只有在c++中使用才有意义。
这是因为在多个嵌套的外部链接说明符的情况下,最里面的一个生效。因此,如果你有一个头文件被extern "C"
包围,你可以使用extern "C++"
暂时脱离它,并声明一些c++链接。
当你想为c++库提供一个通用的C接口时,它是最有意义的,但你也想为在c++中实际使用它的人提供c++帮助位。所以你把#ifdef __cplusplus extern "C" { #endif
作为一个整体放在标题周围,然后你用extern "C++"
来定义这些位,以恢复到c++的链接。
- 当周围的代码默认使用C链接时,强制编译器使用c++链接(例如,在C程序中包含winnt.h)。
- 是的,它应该是便携的 是的,他们可以。在c++程序中,"extern"c++"没有多大用处,因为链接无论如何都是"c++"。只有当你的c++代码很有可能被包含在C代码中时,使用extern c++才有意义。
相关文章:
- 函数何时会在c++中包含stack_Unwind_Resume调用
- Python中的for循环与C++有何不同
- 在C++中释放内存期间,迭代器与指针有何不同
- 寻找闰年的逻辑是如何运作的?
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- 类中的 C++ int 被设置为值,似乎不知从何而来
- -fvisibility-inline-hidden 与 gcc 中的 -fvisibility=hidden 有何不同
- 收益率和回报有何不同?
- 覆盖私有功能,它与受保护功能有何不同?
- Boost.Asio在引擎盖下运作
- 擦除删除成语的性能增益从何而来
- 无论代码长度如何,以下代码的内存要求有何不同?
- 这个简单的程序是如何运作的?
- "virtual"对C++析构函数有何影响?
- 如果我对"while"块发表评论,为什么程序会死机?其中的"yield"线有何影响?
- 系统时间从何而来?
- " return {...}; "在 C++11 中如何运作?
- make_index_sequence如何运作?
- stl::unordered_map 和 stl::vector 的销毁有何不同
- C++ 友元函数在内存位置上有何不同?