非常基础的C语言变量问题,可是我发觉一直没搞明白
我最近在做一个抓包的程序,里面有自定义了很多的类。也用到了一些全局的变量,我的习惯是定义一个Globle.cpp,一个Globle.h.比如在Globle.cpp里面定义变量int a ,在Globle.h里声明为extern int a;然后在我其他文件需要的时候包含Globle.h,就可以用这个全局变量a了。这个办法以前一直用着没问题,但昨晚出问题了。
//我的Globle.h
#ifndef _GLOBLE_H_ //全局变量
#define _GLOBLE_H_
#include "pcap.h"
#include "remote-ext.h"
#pragma comment(lib, "wpcap.lib")//连接库
extern bool bisThreadquit; //声明为外部变量(不是定义),判断线程是否退出
extern pcap_if_t *alldevs; //获得的网卡信息变量
struct ANI//这里这样定义就没错
{
CString str0;
CString str1;
CString str2;
};
struct Macname
{
char* cname;
u_int u_netmask;
};//STRName[5];
struct Macname STRName[5];//!!!!!问题出在这儿
//static struct Macname STRName[5];//!!!!!问题出在这儿
#endif
我定义一个全局的结构体数组Macname STRName[5],然后在其它文件包含了Globle.h,但是程序连接的时候硬说我重复定义了Macname STRName[5]这个数组,但是我除了在上面定义没有在其它地方定义的。
检查了很久,最后加了个static,即static struct Macname STRName[5],就没问题了,但有人说这样我在其它文件里的
Macname STRName[5],不是唯一的一个Macname STRName[5],而是多个,但我断点调试发现确是唯一的一个(因为变量的值同一时刻都是相同的)。
我现在彻底迷茫了,不知道开始我的问题出在了哪里,加了static后为什么又不报错了,求解。
还有就是想问问大家在实际工程中如何处理全局变量的?
谢谢,谢谢,谢谢!!!
[解决办法]
C++ Primer 第4版第2章重点强调过
头文件中,只应该包含各种各样的 声明(declaration),不该包含各种各样的定义(defination).
但是有3个是例外
1. class/struct 的定义
2. inline函数的定义
3. 在编译时(而不是运行时)即可确定值的 const 类型的变量的定义
LZ
struct Macname STRName[5];//!!!!!问题出在这儿
这个是对一个数组的定义,
明显不属于以上3种情况。
所以在 link 的时候会提示有问题。
[解决办法]
不要在头文件里面定义任何全局变量和静态全局变量。如果是全局变量那么就很容易导致你说的那个重复定义的错误,如果是静态全局变量那么在每个包含该头文件的cpp文件里面都会有一份该静态全局变量的定义。
[解决办法]