C/C++报错:全局变量重定义或是多次定义

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_15345177/article/details/88550200

  很多人可能直接把全局变量写进.h文件,然后用多个文件包含这个头文件,编译时就会报错:变量重定义…

头文件的作用就是要给外部提供接口使用的,所以请记住, 只在.h中做声明,在.cpp文件中进行定义,而不要在.h 文件中定义,真理总是这么简单。

那其他文件如何使用这些全局变量呢?

全局变量要在.h 文件中声明,在.cpp文件中定义。定义好了之后,可以在.h文件中利用extern关键字进行声明。


下面通过一个示例为大家展示:

在test.cpp 中定义全局变量

  int g_MaxTime;
  int g_MinTime;
  int g_MaxCount;
  int g_MinCount;

在test.h 中声明全局变量

  extern int g_MaxTime;
  extern int g_MinTime;
  extern int g_MaxCount;
  extern int g_MinCount;

 然后其他文件要使用这些变量的时候,只要 #include “test.h” 就可以了,而且不会引起重复定义的错误。
 

  extern int a;  //声明一个全局变量a

  int a;      //定义一个全局变量a

  extern int a =0; //定义一个全局变量a 并给初值

  int a =0;    //定义一个全局变量a,并给初值


   对变量而言,如果你想在本源文件中使用另一个源文件的变量,就需要在使用前用extern声明该变量,或者在头文件中用extern声明该变量;

  对函数而言,如果你想在本源文件中使用另一个源文件的函数,就需要在使用前用声明该函数,声明函数加不加extern都没关系,所以在头文件中函数可以不用加extern。




C程序采用模块化的编程思想,需合理地将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求,在模块的划分上主要依据功能。模块由头文件和实现文件组成,对头文件和实现文件的正确使用方法是:

规则1:头文件(.h)中是对于该模块接口的声明,接口包括该模块提供给其它模块调用的外部函数及外部全局变量,对这些变量和函数都需在.h中文件中冠以extern关键字声明;

规则2:模块内的函数和全局变量需在.c文件开头冠以static关键字声明;

规则3:永远不要在.h文件中定义变量;

  许多程序员对定义变量和声明变量混淆不清,定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量。如:
在module1.h文件中:int a = 5;
在模块1中:#include "module1.h"
在模块2中:#include "module1.h"
在模块3中:#include "module1.h"

以上程序的结果是在模块1、2、3中都定义了整型变量a,a在不同的模块中对应不同的地址单元,这明显不符合编写者的本意。

正确的做法是:

在module1.h文件中:extern int a;
在module1.c/cpp文件中:int a = 5;
在模块1中:#include "module1.h"
在模块2中:#include "module1.h"
在模块3中:#include "module1.h"

这样如果模块1、2、3操作a的话,对应的是同一片内存单元。

规则4:如果要用其它模块定义的变量和函数,直接包含其头文件即可。


许多程序员喜欢这样做,当他们要访问其它模块定义的变量时,他们在本模块文件开头添加这样的语句:

extern int count ;

抛弃这种做法吧,只要头文件按 规则1 完成,某模块要访问其它模块中定义的全局变量时,只要包含该模块的头文件即可。

猜你喜欢

转载自blog.csdn.net/qq_15345177/article/details/88550200