有时候 我们将常在VS看到: error LNK2001: 无法解析的外部符号 "int Xiao" (?Xiao@@3HA)
这是大多数是因为.c与.cpp的区别。虽然C++兼容C语言 但是编译的时候还是有区别的.下面举例论证
大多数出现在头文件中 因为.h 不知道编译器将它解析为C语言还是C++语言;必须判断对应的.c和.cpp肯定解析为C语言和C++语言
///test1.h(如果是被main.c #include 进来的 这是C语言的代码,按照C语言编译)
int Xiao;//编译器将Xiao重新命名为Xiao
void fun();//编译器将fun重新命名fun
//test1.c
Xiao = 100;
void fun()
{
printf("C Language");
}
///test2.h(如果是被main.cpp #include 进来的 这是C++语言的代码,按照C++语言编译)
int Xiao;//编译器将Xiao重新命名为Xiao_INT
//test2.cpp
Xiao = 100;
void fun()
{
printf("C++ Language");
}
//main.cpp(主函数C++代码 调用test1.h)
#include "test1.h"//C语言代码出现问题
///#include "test2.h"//C++语言代码不会出现问题
void main()
{
Xiao = 100;//直接使用就会出现无法解析的外部符号 "int Xiao" (?Xiao@@3HA)
fun();//直接使用就会出现无法解析的外部符号 "int fun" (?fun@@3HA);
//因为main是cpp即c++语言。编译器认为是 Xiao_INT和fun_VOID因此找不到外部符号
}
正确调用方法
//main.cpp(C++代码主函数 调用test1.h)
#include "test1.h"
extern "C" int Xiao;
extern "C" void fun();
//也可以这么用
extern "C"
{
int Xiao;
void fun();
}
void main()
{
Xiao = 100;//直接使用就会出现无法解析的外部符号 "int Xiao" (?Xiao@@3HA)
fun();//直接使用就会出现无法解析的外部符号 "int fun" (?fun@@3HA)
}
//最常用的方法还是下面更改test1.h的代码
///test1.h(这是C语言的代码,按照C语言编译)
#ifdef __cplusplus
extern "C" {
#endif
int Xiao;//编译器将Xiao重新命名为Xiao
void fun();//编译器将fun重新命名fun
#ifdef __cplusplus
};
#endif