首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

非常基础的C语言变量有关问题,可是小弟我发觉一直没搞明白

2012-04-02 
非常基础的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; //获得的网卡信息变量
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文件里面都会有一份该静态全局变量的定义。
[解决办法]

探讨
C++ Primer 第4版第2章重点强调过

头文件中,只应该包含各种各样的 声明(declaration),不该包含各种各样的定义(defination).
但是有3个是例外

1. class/struct 的定义
2. inline函数的定义
3. 在编译时(而不是运行时)即可确定值的 const 类型的变量的定义

LZ
struct Macname STRName[……

[解决办法]
extern 关键字,如果没有显示初始化(赋值操作),应该是表示声明,否则表示定义。所以,你要在另一个cpp里定义(含有赋值操作)extern标定的数组,然后在其他文件中引用到该变量时,加上extern 声明(不带赋值操作),你试试吧,好久没关注了
[解决办法]
在头文件里定义数组,如果有多个cpp文件包含了这个头文件,则会发生重定义
因为在编译时,#include "head.h"其实就是把这一句替换为头文件head.h的内容。

热点排行