C++中的“C”的作用是什么?

>代码>外部> C >代码> C++代码是什么?

例如:

外部“C”{
void foo();
}

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


由于C++具有函数名的超载,C没有,C++编译器不能只使用函数名作为唯一ID来链接,所以它通过添加参数的信息来修改名称。C编译器不需要损坏名称,因为您不能在C中重载函数名。当您声明函数具有extern”时;" C++编译器不为链接使用的名称添加参数/参数类型信息。

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

extern"";void foo(int);
“外部”;";
{
void g(char);
int i;
}

如果您关心这些技术细节,请参见C++03标准的第7.5节,这里是一个简要的总结(重点是extern"C):

  • extern""是一种连杆规格
  • 每个编译器都需要提供;";联动
  • 链接规范只能出现在名称空间范围内
  • 所有函数类型、函数名和变量名都有语言链接请参见Richard的评论:只有具有外部链接的函数名和变量名才有语言链接
  • 具有不同语言链接的两种函数类型是不同的类型,即使在其他方面相同
  • 连杆规格嵌套,内部规格决定最终连杆
  • extern""
  • 最多一个具有特定名称的函数可以有;";链接(不考虑名称空间)
  • 外部;"强制函数具有外部链接(不能使其静态)参见Richard的评论:静态内部外部""有效;这样声明的实体具有内部链接,因此没有语言链接
  • Linkage从C++到其他语言定义的对象,以及C++语言中定义的对象,都是由实现定义和语言依赖的。只有当两种语言实现的对象布局策略足够相似时,才能实现这种链接

发表评论