gpt4 book ai didi

c++ - C++中extern "C"有什么作用?

转载 作者:太空宇宙 更新时间:2023-11-04 11:45:14 25 4
gpt4 key购买 nike

extern "C" 放入 C++ 代码中究竟有什么作用?

例如:

extern "C" {
void foo();
}

最佳答案

extern "C" 使 C++ 中的函数名称具有 C 链接(编译器不会破坏名称),以便客户端 C 代码可以使用 C 兼容 header 链接(使用)您的函数只包含函数声明的文件。您的函数定义包含在二进制格式中(由您的 C++ 编译器编译),然后客户端 C 链接器将使用 C 名称链接到该二进制格式。

由于 C++ 具有函数名称的重载而 C 没有,C++ 编译器不能仅使用函数名称作为链接的唯一 ID,因此它通过添加有关参数的信息来破坏名称。 C 编译器不需要破坏名称,因为您不能在 C 中重载函数名称。当您声明函数在 C++ 中具有 extern "C" 链接时,C++ 编译器不会添加参数/参数将信息键入用于链接的名称。

如你所知,你可以为每个单独的声明/定义显式指定extern "C" 链接,或者使用 block 将一系列声明/定义分组以具有特定链接:

extern "C" void foo(int);
extern "C"
{
void g(char);
int i;
}

如果您关心技术细节,它们在 C++03 标准的第 7.5 节中列出,这里是一个简短的摘要(强调 extern "C"):

  • extern "C" 是链接规范
  • 每个编译器都需要提供“C”链接
  • 链接规范应仅出现在命名空间范围内
  • 所有函数类型、函数名和变量名都有语言链接 See Richard's Comment: 只有带有外部链接的函数名和变量名才有语言链接
  • 具有不同语言链接的两种函数类型是不同的类型,即使其他方面相同也是如此
  • Linkage specs嵌套,内层决定最终的链接
  • extern "C" 类成员忽略
  • 至多一个具有特定名称的函数可以具有“C”链接(无论命名空间如何)
  • extern "C" 强制函数具有外部链接(不能使其成为静态的) See Richard's comment: extern "C" 中的 static 有效;如此声明的实体具有内部链接,因此没有语言链接
  • 从 C++ 到以其他语言定义的对象的链接以及从其他语言到以 C++ 定义的对象的链接是实现定义的和语言相关的。只有两种语言实现的对象布局策略足够相似,才能实现这种联动

关于c++ - C++中extern "C"有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57974122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com