C++项目是由 .h 文件和 .cpp 文件组成的,如果 A文件(.h&.cpp) 使用了B件(.h&.cpp) 中定义的全局变量或者全局结构体,这时 visual studio 会报错:重定义或者多次定义。
解决办法:
一、对于全局变量
在 B.h 中声明全局变量,并在前面冠上 extern 关键字,然后在 B.cpp 中定义即可。
int a; //在 .h 中,这个算定义,会报错
extern int a; //在 .h 中用 extern 声明
int a; //在 .cpp 中定义
那有人会问了,在 B.h 中声明的 class B 的数据成员没有用 extern 关键字啊,怎么不报错呢?因为 B 的数据成员是属于类B的,在 B.h 中不用加 extern 也算声明,而不是定义。
之后 类A只需要 include B.h 即可使用变量 a。
二、对于全局结构体
在 B.h 中定义的全局结构体,可以在 A 中直接使用该结构体类型来定义变量;
// B.h
struct XXX
{
int a;
int b;
};
//A.h
XXX tmp;
//A.cpp
tmp.a=0;
tmp.b=1;
在 B.h 中定义的全局结构体, A 中使用该类型来定义变量时需要 extern 声明;
// B.h
struct XXX
{
int a;
int b;
};
//A.h
extern queue<XXX> tmp;
//A.cpp
queue<XXX> tmp;
三、对于全局函数
同样,也可以在 头文件用 extern 声明,在cpp文件实现。
// B.h
extern bool isValid(int y);
//B.cpp
bool isValid(int y)
{
return y>0? true : false;
}
总结:
- 头文件 (.h) 是该类提供的接口的声明,接口包括该类提供给其它类调用的全局变量和函数,对这些变量和函数都需在 .h 中文件中冠以 extern 关键字声明。
- 不要在头文件 (.h) 中定义全局变量。
- 其他类要使用该类的变量或者函数,直接包含该类的头文件即可。
网友评论