另一个方法是更改C头文件以检查是否正在由cpp编译器编译并有条件地包含extern"C":
#ifdef __cplusplus
extern "C" {
#endif
void func1(int a, int b);
//... other functions
#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)
您需要extern "C"在头文件中使用导入过程的声明,以便使用C链接.
目前正在发生的事情是C++编译器期望导入函数的名称损坏.使用extern "C"关闭C++名称修改的开关.
例如:
extern "C"
{
int Func1(int a, int b);
void Func2(double a);
}
Run Code Online (Sandbox Code Playgroud)
由于您可以控制头文件,因此将它放在头文件中会更有意义extern "C".这意味着任何使用头文件的人都不需要关心这些问题.但是,当包含您无法控制的头文件时,@ Nawaz的建议是一种灵活的方式.
我也忘了提到@bcsanches提出的优点extern "C"是C++而不是C.因此,如果你想要一个头文件同时适用于C和C++,它需要有条件地包括在内.
将C头添加到C++项目时执行此操作:
extern "C"
{
#include "cheader.h" //C header
}
Run Code Online (Sandbox Code Playgroud)
这可以防止C++编译器对定义的名称进行名称修改cheader.h
您甚至可以将命名空间定义为:
namespace cproject
{
extern "C"
{
#include "cheader.h" //C header
}
}
Run Code Online (Sandbox Code Playgroud)
如果你这样做,那么cproject::当你引用中定义的名字时,你必须使用每个名称(函数,变量,结构)来限定cheader.h.