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

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

究竟是什么放extern "C"变成C++代码做什么?

例如:

extern "C" {
   void foo();
}

最佳答案

extern "C"使 C++ 中的函数名称具有 C 链接(编译器不会修改名称),以便客户端 C 代码可以使用仅包含函数声明的 C 兼容头文件链接到(使用)您的函数。您的函数定义包含在二进制格式中(由您的 C++ 编译器编译),然后客户端 C 链接器将使用 C 名称链接到该格式。
由于 C++ 有函数名的重载而 C 没有,C++ 编译器不能只使用函数名作为唯一的 id 来链接,所以它通过添加有关参数的信息来破坏名称。 C 编译器不需要修改名称,因为您不能在 C 中重载函数名称。当您声明函数具有 extern "C" 时C++ 中的链接,C++ 编译器不会向用于链接的名称添加参数/参数类型信息。
如您所知,您可以指定 extern "C"显式链接到每个单独的声明/定义或使用块将一系列声明/定义分组以具有特定链接:

extern "C" void foo(int);
extern "C"
{
   void g(char);
   int i;
}
如果你关心技术细节,它们在 C++03 标准的第 7.5 节中列出,这里是一个简短的总结(重点是 extern "C"):
  • extern "C"是联动规范
  • 每个编译器都需要提供“C”链接
  • 链接规范应仅出现在 namespace 范围
  • 所有函数类型、函数名和变量名都有语言链接 See Richard's Comment:只有有外部链接的函数名和变量名才有语言链接
  • 具有不同语言链接的两个函数类型是不同类型,即使其他方面相同
  • 联动规范巢,内一决定最终联动
  • extern "C"被类(class)成员忽略
  • 最多一个具有特定名称的函数可以具有“C”链接(无论 namespace 如何)
  • extern "C"强制函数具有外部链接(不能使其静态)See Richard's comment: staticextern "C"已验证;如此声明的实体具有内部链接,因此没有语言链接
  • 从 C++ 到用其他语言定义的对象以及从其他语言到用 C++ 定义的对象的链接是实现定义的和语言相关的。只有两种语言实现的对象布局策略足够相似,才能实现这种联动
  • 关于c++ - C++中extern "C"的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69109861/

    相关文章:

    linux - ld-linux.so.2 和 linux-gate.so.1 是什么?

    c++ - 是否允许类在程序中的不同翻译单元中有不同的定义?

    c++ - 模板化检查是否存在类成员函数?

    c++ - 在C++的编译时初始化派生结构类型的变量

    c - 从 gcc 引出 "unrecognized command line option"

    c - C 中的 Makefile 错误

    c++ - 在 qt C++ 中从 mysql 创建一个动态数据结构

    c++ - 如何对像素数据使用 CImg 函数?

    c - 内存释放模拟问题

    c++11 - 什么时候应该使用静态数据成员与 const 全局变量?