说说编译成功或失败的原因
extern "C" int ave();
int ave()
{
return 1;
}
因为指定是使用C语言的命名规则,生成的目标文件中就有一个类似
ave_我是C连接符 的名字
int ave()
{
return 1;
}
因为没指定使用C语言的命名规则,生成的目标文件中就有一个类似
ave_我是C++连接符 的名字
#include<iostream>
extern "C" int ave();
int main()
{
std::cout << ave();
}
因为指定是使用C语言的命名规则,它会在目标文件中寻找类似
ave_我是C连接符 的名字
#include<iostream>
int main()
{
std::cout << ave();
}
因为没指定使用C语言的命名规则,它会在目标文件中寻找类似
ave_我是C++连接符 的名字
--------------------------------
而C和C++的链接名不一样的原因是 C++支持重载,即 不同的函数在源代码中可以使用同一个名称,那么自然就需要在目标文件中区分开,实际使用不同的名称
比如
int foo( int );
int foo( double, double );
在C++中可以同时存在,因此它需要在编译时取个不同的名字,比如
foo_这是参数为int的链接名
foo_这是参数为double和double的链接名
而C语言不允许重载,那只需要简单的
_foo
定义 和 调用 必须保证同名才会在 link 阶段找到