前言
今天,当自己整理自己的代码时,我写的代码在一个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++
领取专属 10元无门槛券
私享最新 技术干货