上面已经回答了,但我会试着把事情放到上下文中go .
首先,C排在第一位.因此,在某种程度上,C所做的是"默认的".它不会损坏名称,因为它就是不会.函数名就是函数名.全局就是全局,依此类推.
然后C++出现了.C++希望能够使用与C相同的链接器,并且能够与用C编写的代码链接,但是C++不能让C"损坏"(或缺少).查看以下示例:
int function(int a);
int function();
在C++中,这些函数是不同的,具有不同的体.如果它们都没有损坏,则两者都将被称为"函数"(或"_函数"),链接器将抱怨符号的重新定义.C++解决方案是将参数类型转换成函数名.因此,一个被称为_function_int
,另一个被称为_function_void
(不是实际的 destruct 方案),避免了碰撞.
现在我们只剩下一个问题了.如果int function(int a)
是在C模块中定义的,并且我们只是在C++代码中获取它的头(即声明)并使用它,编译器将向链接器生成一条指令来导入_function_int
.当函数被定义时,在C模块中,它没有被调用.它被称为_function
.这将导致链接器错误.
为了避免该错误,在函数的第declaration次执行期间,我们告诉编译器它是一个设计为与C编译器链接或由C编译器编译的函数:
extern "C" int function(int a);
C++编译器现在知道导入_function
而不是_function_int
,并且一切都很好.