最近我接受了一个采访,一个问题是C++中extern "C"的用法.我回答说,C语言中使用C++函数,因为C不使用名称修改.有人问我为什么C不使用名称混乱,说实话,我无法回答.

我理解C++编译器编译函数时,它给函数赋予了一个特殊的名称,主要是因为我们可以在C++中有相同名称的重载函数,这些函数必须在编译时得到解决.在C语言中,函数的名称将保持不变,或者在它前面加一个u.

我的疑问是:允许C++编译器将C函数也转换为错误是什么?我会假设编译器给它们起什么名字并不重要.在C和C++中,我们用相同的方式调用函数.

推荐答案

上面已经回答了,但我会试着把事情放到上下文中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,并且一切都很好.

C++相关问答推荐

如何避免重新分配指针数组时,我们从一开始就不知道确切的大小

减法运算结果的平方的最快方法?

是否所有C编译器在将浮点数转换为整型数时都会隐式删除小数?

C是否用0填充多维数组的其余部分?

如何在C中使printf不刷新标准输出?

为什么cudaFree不需要数据 struct 的地址?

为什么将函数名括在括号中会禁用隐式声明?

从uint8_t*转换为char*可接受

getline()从c中的外部函数传递指针时输出null

无法在OpenGL上绘制三角形

为什么我的旧式&q;函数在传递浮点数时会打印2?

正在try 理解C++中的`正在释放的指针未被分配‘错误

Dlsym()的手册页解决方法仍然容易出错?

如何解释数组中的*(ptr)和*(ptr+2)?

将char*数组深度复制到 struct 中?

free后内存泄漏?

无法在线程内用 C 打印?

在 C 中的 scanf() 格式说明符中使用宏获取字符串长度

运行以下 C 程序时出现分段错误

int 与 size_t 与 long