C++项目中全局变量/全局结构体重定义或者多次定义的问题

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 tmp;
//A.cpp
queue tmp;
三、对于全局函数

同样,也可以在 头文件用 extern 声明,在cpp文件实现。

// B.h
extern bool isValid(int y);
//B.cpp
bool isValid(int y)
{
      return y>0? true : false;
}
总结:
  1. 头文件 (.h) 是该类提供的接口的声明,接口包括该类提供给其它类调用的全局变量和函数,对这些变量和函数都需在 .h 中文件中冠以 extern 关键字声明。
  2. 不要在头文件 (.h) 中定义全局变量。
  3. 其他类要使用该类的变量或者函数,直接包含该类的头文件即可。

你可能感兴趣的:(C++项目中全局变量/全局结构体重定义或者多次定义的问题)