C++多文件间函数调用及全局变量共享问题
涉及extern标识符声明:
常见多文件全局变量包含问题
在.h文件中不要定义变量,通常为声明变量,定义变量会出现“error LNK2005: 已经在 .obj 中定义”类似这样的错误。根据c++规定,变量的声明必须同时满足两个条件:(1)声明必须使用extern关键字;(2)不能给变量赋初值
例:
extern int a; //声明
int a; //定义
int a = 0; //定义
extern int a = 0; //定义
一、 多文件函数声明方式
在“.h”文件中将可共享函数前加上extern
例:
单个cpp程序
void InitData(); //具体定义在对应源文件中
多个cpp程序
extern void InitData(); //具体定义在对应源文件中
二、 全局变量声明方式
单个cpp程序
int CouNum = 0;
unsigned char CommandLen = 0;
多个cpp程序
“.h”文件中声明
extern int CouNum;
extern unsigned char CommandLen;
“.cpp”文件中定义及初始化
extern int CouNum = 0;
extern unsigned char CommandLen = 0;
三 、注意数组类型声明方式
* 普通数组 *
单个cpp程序
int CouNum[5];
多个cpp程序
“.h”文件中声明(注意数组[ ]内不标长度)
extern int CouNum[];
“.cpp”文件中定义及初始化
extern int CouNum[5] = {0,1,2,3,4,5};
* 结构体数组 *
单个cpp程序
typedef struct Cluster {
int num; //簇内站点个数
int NO[100]; //簇站点编号
int classlabel; //簇标记
}CLU;
CLU Clu_data[10];
多个cpp程序
“.h”文件中声明(注意数组[ ]内不标长度)
typedef struct Cluster {
int num; //簇内站点个数
int NO[100]; //簇站点编号
int classlabel; //簇标记
}CLU; //头文件中定义结构体
extern CLU Clu_data[]; //声明结构体数组
“.cpp”文件中定义(其他源文件只要包含”.h”文件即可使用全局变量)
CLU Clu_data[10];
另外注意若在全局变量定义所在源文件使用static标识符,则该变量只在当前cpp内有效。头文件不会进行编译,当在头文件里使用static标识符时只在包含该头文件的.cpp文件进行编译时使用static定义