c++ - extern “C”在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中重载函数名称。当您声明函数在C++中具有extern "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”链接
  • 链接规范只能在命名空间范围
  • 中出现
  • 所有函数类型,函数名称和变量名称具有语言链接See Richard's Comment:只有具有外部链接的函数名称和变量名称具有语言链接
  • 即使具有相同的
  • ,具有不同语言链接的两个函数类型也是不同的类型
  • 链接规格嵌套,内部一个决定最终的链接
  • 类成员忽略extern "C"
  • 最多一个具有特定名称的函数可以具有“C”链接(无论 namespace 如何)
  • extern "C"强制函数具有外部链接(不能使其静态)static中的See Richard's comment: extern "C"有效;这样声明的实体具有内部链接,因此没有语言链接
  • 从C++到其他语言定义的对象以及从其他语言到C++定义的对象的链接是实现定义的,并且取决于语言。只有在两种语言实现的对象布局策略足够相似的情况下,才能实现这种链接
  • 关于c++ - extern “C”在C++中有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60450816/

    相关文章:

    c++ - undefined reference 复制ctor和ctor

    c++ - 具有特定颜色的像素不在它在 SFML 中的位置

    c++ - 鼠标移动时在透明 HDC 上绘图

    c - 在 C 中使用 SIGALRM 强制函数结束

    c++ - Qt检查多个按钮的状态

    c - 开放计算机视觉中 C 中 undefined reference

    matlab - 生成错误的树状图

    c++ - C++ 命名空间中静态函数的链接

    c - 为什么我的 #ifndef 预处理器指令在编译时不能阻止 header 的多次包含?

    c - 在 C 中安全重启 linux