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

标签 c++ c linkage name-mangling extern-c

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: 只有具有外部链接的函数名和变量名才有语言链接
  • 具有不同语言链接的两个函数类型即使在其他方面相同也是不同的类型
  • 联动规范嵌套,内层决定最终联动
  • extern "C" 被类成员忽略
  • 至多一个具有特定名称的函数可以具有“C”链接(无论命名空间如何)
  • extern "C" 强制函数具有外部链接(不能使其成为静态) See Richard's comment: extern "C"内的 static有效;如此声明的实体具有内部链接,因此没有语言链接
  • 从 C++ 到用其他语言定义的对象以及从其他语言到用 C++ 定义的对象的链接是实现定义和语言相关的。只有在两种语言实现的对象布局策略足够相似的情况下,才能实现这样的联动

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

相关文章:

c++ - 如何在cpp中控制递归

c++ - 在tensorflow c++中是否有将base64字符串解码为张量的函数?

c - 为什么只有 1% 的时间我会得到不同的结果?

c++ - 在对比拉伸(stretch)方面需要帮助

python - 我试图用 c 中的逻辑在 python 中实现行计数程序

c - 嵌套的 typedef 结构

c++ - 匿名命名空间是否包含所有命名空间?

c++ - c 和 c++ 与库的链接

c++ - 外部联动

c++ - Qt:在子部件上使用 QPainter