c++ - 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”链接?
解决方案
这取决于您使用的标准库,而不是编译器。
通常,g++
您将使用libstdc++
GNU C++ 库(它又依赖于glibc
GNU C 库)。默认情况下,这个看起来像是对 C 名称使用 C 链接。如果您查看源代码本身,您当前会看到可能使用的 4 组不同的 C 头文件。
在任何情况下,您都不应该依赖它,而且它也可能在没有任何警告的情况下发生变化,即使在发布之间也是如此。
理想情况下,如果您出于某种原因需要导出的名称(无论是否损坏),您应该直接从共享对象或编译器正在使用的头文件中获取它,而不是依赖给定的链接。
话虽如此,主要的标准库/编译器都将它们提供为extern "C"
,甚至是 Windows 上的 MSVC;即使您使用 C++cname
标头(当然是全局命名空间中的标头)。
推荐阅读
- java - 交换变量的用户整数输入,使其递增和递减
- mysql - Laravel 5.8 中的日期比较
- perforce - p4 sync -p 在 Perforce 中的某些条件下不起作用
- java - 如何将文本大小添加到 ListView?
- php - Laravel Vue 脚手架、Auth 和 Nova 安装顺序?
- javascript - 函数没有返回“中国银联”,不知道为什么
- typescript - JSX 元素类型“HTMLImageElement”不是 JSX 元素的构造函数
- c++ - 将 N-arg 函数包装到另一个函数中
- javascript - javascript autoclick 似乎没有自动点击
- jquery - jquery attr 有效,但动画失败