首页 > 解决方案 > g++ 是否将 C 标准库的名称声明为 extern "C" 链接或 extern "C++"?

问题描述

根据 ISO_14882_2014,第-[17.6.2] 节,

Whether a name from the C standard library declared with external linkage has
extern "C" or extern "C++" linkage is implementation-defined. It is 
recommended that an implementation use extern "C++" linkage for this purpose.

由于这是一个实现定义的行为,我正在为此查看 g++ 文档,但没有任何内容。

g++ 对 C 标准库函数有什么链接?我检查了名称是否因任何功能而受到破坏。发现不是。那么这是否意味着 g++ 具有外部“C”链接?

标签: c++g++

解决方案


这取决于您使用的标准库,而不是编译器。

通常,g++您将使用libstdc++GNU C++ 库(它又依赖于glibcGNU C 库)。默认情况下,这个看起来像是对 C 名称使用 C 链接。如果您查看源代码本身,您当前会看到可能使用的 4 组不同的 C 头文件。

在任何情况下,您都不应该依赖它,而且它也可能在没有任何警告的情况下发生变化,即使在发布之间也是如此。

理想情况下,如果您出于某种原因需要导出的名称(无论是否损坏),您应该直接从共享对象或编译器正在使用的头文件中获取它,而不是依赖给定的链接。

话虽如此,主要的标准库/编译器都将它们提供为extern "C",甚至是 Windows 上的 MSVC;即使您使用 C++cname标头(当然是全局命名空间中的标头)。


推荐阅读