📅  最后修改于: 2023-12-03 15:37:34.811000             🧑  作者: Mango
在C++中,为了支持函数重载,编译器会对函数名和符号进行修饰,也就是添加一些额外的信息来区分不同的函数和重载函数。这种修饰方式被称作名称修饰(name mangling)。
但是,在某些情况下,我们需要使用C++代码调用C语言的函数,这时候就需要使用extern "C"来告诉编译器该函数按照C语言的方式来进行链接。在这种情况下,编译器会直接使用函数名作为符号,而不会进行名称修饰。
下面是一个示例:
// test.c
#include <stdio.h>
void foo() {
printf("Hello, C!\n");
}
// test.cpp
#include <iostream>
extern "C" void foo();
void bar() {
std::cout << "Hello, C++!" << std::endl;
foo(); // 调用C语言的函数
}
int main() {
bar();
return 0;
}
在上面的示例中,test.c中的函数foo没有进行名称修饰,test.cpp中使用了extern "C"来告诉编译器该函数不进行名称修饰。在bar函数中,可以直接使用foo来调用C语言的函数。
需要注意的是,如果C语言的函数中有参数或返回值,需要在C++代码中进行类型转换。例如:
// test.c
int add(int a, int b) {
return a + b;
}
// test.cpp
extern "C" int add(int a, int b);
int main() {
int a = 1, b = 2;
int c = add(a, b); // C++需要进行类型转换
return 0;
}
总结一下,在C++中需要使用extern "C"来告诉编译器使用C语言的链接方式。同时,在调用C语言的函数时需要进行类型转换。