上面已经回答了这个问题,但是我将尝试将其放在上下文中。
首先,C是第一位。这样,C所做的就是“默认”。它不会破坏名称,因为它不会。函数名称是函数名称。全局是全局,依此类推。
然后C ++出现了。C ++希望能够使用与C相同的链接器,并且能够与用C编写的代码进行链接。但是C ++不能使C保持“整齐”(或缺少)。查看以下示例:
int function(int a);
int function();
在C ++中,这些是不同的函数,具有不同的主体。如果没有一个被重整,则两个都将被称为“函数”(或“ _function”),并且链接程序将抱怨重新定义符号。C ++解决方案是将参数类型转换为函数名称。因此,一个被调用_function_int
而另一个被调用_function_void
(不是实际的处理方案),并且避免了冲突。
现在我们有一个问题。如果int function(int a)
是在C模块中定义的,而我们仅使用C ++代码中的标头(即声明)并使用它,则编译器将生成一条指令以导入链接器_function_int
。在C模块中定义函数时,未将其称为。它被称为_function
。这将导致链接器错误。
为了避免该错误,在函数声明期间,我们告诉编译器它是一个旨在与C编译器链接或编译的函数:
extern "C" int function(int a);
现在,C ++编译器知道要导入_function
而不是_function_int
,并且一切都很好。