在C中调用C++代码,通常需要使用`extern "C"`来避免C++的名称修饰(name mangling),这会导致链接错误。以下是具体的步骤和注意事项:
C++代码中使用`extern "C"`
在C++代码中,如果需要被C代码调用,需要在函数声明前加上`extern "C"`。这告诉C++编译器使用C语言的链接规则来生成符号,从而使得C代码可以找到并调用这些函数。
C代码中调用C++函数
C代码可以直接调用添加了`extern "C"`声明的C++函数。为了确保C++代码中的函数能够被C代码正确调用,需要在C++代码中提供一个C语言的接口,这个接口函数也应该使用`extern "C"`来声明。
处理重载函数
如果C++代码中有重载函数,只能为每个重载函数提供一个C语言的接口,并且每个接口都需要使用`extern "C"`来声明。这样可以确保在C代码中调用时,每个重载函数都有一个唯一的C语言名称。
头文件中的条件编译
为了确保在C和C++环境中都能正确使用,可以在头文件中使用条件编译来处理`extern "C"`声明。这样,在C++环境中,`extern "C"`会被包含,而在C环境中则不会被包含。
链接C++库
如果C代码需要调用C++编写的库,需要确保库中的所有函数都使用了`extern "C"`声明。在C代码中链接C++库时,可能需要添加`-lstdc++`或其他相关选项来确保C++标准库被正确链接。
示例代码
C++代码 (`test.cpp`):
```cpp
#include
extern "C" {
void print(int a, double b) {
std::cout << "C++ print: "<< a << ", "<< b << std::endl;
}
}
int main() {
print(1, 2.0);
return 0;
}
C代码 (`main.c`):
```c
#include #include "test.h" int main() { print(1, 2.0); return 0; } 头文件 (`test.h`): ```c #ifndef TEST_H #define TEST_H #ifdef __cplusplus extern "C" { #endif void print(int a, double b); #ifdef __cplusplus } #endif #endif // TEST_H 在这个示例中,`test.cpp`中的`print`函数使用了`extern "C"`声明,这样它就可以被C代码`main.c`调用。头文件`test.h`中的条件编译确保了在C和C++环境中都能正确使用`extern "C"`声明。


