看月薪20k的大神,如何解决C/加加语言中,全局变量重复定义的问题

前言

今天,当自己整理自己的代码时,我写的代码在一个CPP文件中,从一个到另一个。因此,我希望将自己的代码模块分开,以便能够更好地阅读和管理。

遇到的问题

我的方法是:

宏定义、结构定义、函数声明和全局变量定义放在头文件中。

函数的定义放在head.cpp

主要功能是放置在main.cpp

然而,据报道,XXX变量定义在* .obj文件

问题出现的原因

为什么会发生这些?

首先,单个文件的编译是独立的。编译main.cpp来main.obj Head.obj在head.cpp。在这个过程中没有错误,这意味着编译过程没有问题。

其次是链接对象。当连接main.obj和Head.obj,编译器发现Head.obj分配的内存空间为这些全局变量,而main.obj分配内存空间的这些全局变量。

同一个变量有两个不同的内存地址。编译器报错了。

不是办法的办法

把head.h里面的头文件的全局变量都加上static。编译便可通过,可是却会不经意出现了其他问题。

static只是把变量的生存周期延长,同时也把该变量限定于当前的文件。而之所以能用于main.cpp中,是因为在编译的时候复制了一个变量名相同的变量给main.cpp而已。那么main.cpp里面的“全局变量”的改变,并不能改变原来head.h里面的全局变量的值。

这样子虽然编译通过了,但是程序是错误的。

真正的解决方法

把全局变量定义在head.cpp文件。

将全局变量的声明存储在头文件中,外部应用在每个声明前加extern修饰。

我的个人想法

我想为了能够更全面地分离全局变量,一种方法是:

全局变量的定义仍然是在head.cpp。

创建一个global.h的头文件。存放全局变量的声明,在每个前面声明extern。

在其他文件需要用到全局变量的时候,将global.h头文件#include进来。

结言

当使用C或C++语言,往往因为实验以及课设所需要写的代码不太多,于是养成了一种习惯,一个main.cpp写到结尾。当你真正分离自己的模块代码时,由于全局变量的定义,发现因为定义的全局变量导致编译链接出现错误。

如果对C/C++感兴趣,想了解更多的编程知识,解决编程问题,以及入门指导,帮你解决编程中遇到的困惑,可以加入小编裙,裙豪:六二六八七一九一六,邀请马【往事】,每天不定期分享C/C++视频资源,可以很多兴趣相同的小伙伴们交流讨论,共同进步!还有大牛指导,是个非常好的学习交流地方!很快满员了。欲进从速哦!等大家加入学习交流基地哦关于C语言C++

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180317A0H0VB00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券