非常基础的C语言变量有关问题,可是小弟我发觉一直没搞明白
非常基础的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; //获得的网卡信息变量
// 自定义消息
#define WM_PDATABUF (WM_USER+101) //发送数据包解析
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后为什么又不报错了,求解。
还有就是想问问大家在实际工程中如何处理全局变量的?
谢谢,谢谢,谢谢!!!
------解决方案--------------------
需要extern
static具有文件可见性,即其它源文件不可见此变量,当然不会重定义了
------解决方案--------------------
static的作用域在编译单元有效,在“Globle.h”定义了一个static对象,其他模块include“Globle.h”的时候,编译器会分配一个只在该模块可见的static对象,在该模块对static对象的操作也只会改变自己模块的那个值,对其他引用模块没有影响。
上面这个是我根据static变量的规则自己试验的结果
------解决方案--------------------
1、我的习惯是定义一个Globle.cpp,一个Globle.h.比如在Globle.cpp里面定义变量int a ,在Globle.h里声明为extern int a;然后在我其他文件需要的时候包含Globle.h,就可以用这个全局变量a了。
这一点你比我强,我以前一直是每个cpp中加extern int a,后来才意识到可以加在h文件中。
这个方法仍然是最好的办法。大家在实际工程中如何处理全局变量就是这样处理的。关键是h文件中必须有“extern”。
2、struct Macname STRName[5];//!!!!!问题出在这儿
Globle.h这样肯定不行的,如果Globle.h只被其它cpp文件包含一次是可以的。
如果Globle.h只被n个其它cpp文件,就是重复定义,肯定不行。
所以:极少有人在h文件中定义全局变量。
3、静态变量的文件有效性2楼已经回答。
所以可以在在h文件中定义静态变量,而且还比较常见。当然你也可以每个文件单独添加。
我最近在做一个抓包的程序,里面有自定义了很多的类。也用到了一些全局的变量,我的习惯是定义一个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; //获得的网卡信息变量
// 自定义消息
#define WM_PDATABUF (WM_USER+101) //发送数据包解析
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后为什么又不报错了,求解。
还有就是想问问大家在实际工程中如何处理全局变量的?
谢谢,谢谢,谢谢!!!
------解决方案--------------------
需要extern
static具有文件可见性,即其它源文件不可见此变量,当然不会重定义了
------解决方案--------------------
static的作用域在编译单元有效,在“Globle.h”定义了一个static对象,其他模块include“Globle.h”的时候,编译器会分配一个只在该模块可见的static对象,在该模块对static对象的操作也只会改变自己模块的那个值,对其他引用模块没有影响。
上面这个是我根据static变量的规则自己试验的结果
------解决方案--------------------
1、我的习惯是定义一个Globle.cpp,一个Globle.h.比如在Globle.cpp里面定义变量int a ,在Globle.h里声明为extern int a;然后在我其他文件需要的时候包含Globle.h,就可以用这个全局变量a了。
这一点你比我强,我以前一直是每个cpp中加extern int a,后来才意识到可以加在h文件中。
这个方法仍然是最好的办法。大家在实际工程中如何处理全局变量就是这样处理的。关键是h文件中必须有“extern”。
2、struct Macname STRName[5];//!!!!!问题出在这儿
Globle.h这样肯定不行的,如果Globle.h只被其它cpp文件包含一次是可以的。
如果Globle.h只被n个其它cpp文件,就是重复定义,肯定不行。
所以:极少有人在h文件中定义全局变量。
3、静态变量的文件有效性2楼已经回答。
所以可以在在h文件中定义静态变量,而且还比较常见。当然你也可以每个文件单独添加。