解决C/C++语言中全局变量重复定义的问题
前言
今天,在整理自己的代码的时候,考虑到我写的代码从一至终都是在一个cpp文件里面。于是,想把自己的代码中的各个模块分离开来,以便更好地阅读和管理。
遇到的问题
我的做法是:
- 宏定义、结构体定义、函数声明以及全局变量定义放到一个head.h头文件中
- 函数的定义放到head.cpp中
- main函数放到main.cpp中
然而却报错了,提示xxx变量在*.obj文件中已定义
问题出现的原因
为什么会出现这种情况呢?
- 首先单个文件的编译是独立的。在head.cpp编译到head.obj,main.cpp编译到main.obj。这个过程没有报错,也就是说明编译过程是没有问题的。
- 接下来是obj的链接。在链接main.obj与head.obj的时候,此时编译器发现head.obj为这些全局变量分配了内存空间,而在main.obj中也为这些全局变量分配了内存空间。
- 同样一个变量却出现了两个不同的内存地址。于是编译器报错。
不是办法的办法
把head.h里面的头文件的全局变量都加上static。编译便可通过,可是却会不经意出现了其他问题。
static只是把变量的生存周期延长,同时也把该变量限定于当前的文件。而之所以能用于main.cpp中,是因为在编译的时候复制了一个变量名相同的变量给main.cpp而已。那么main.cpp里面的“全局变量”的改变,并不能改变原来head.h里面的全局变量的值。
这样子虽然编译通过了,但是程序是错误的。
真正的解决方法
- 把全局变量定义放到head.cpp文件中。
- 在head.h存放全局变量的声明,同时每个声明前用
extern
去修饰。
我的个人想法
我觉得为了能更加分离全局变量,可以做的一个做法是:
- 全局变量定义依旧放在head.cpp中。
- 新建一个global.h的头文件,存放全局变量的声明,同时每个声明前用
extern
去修饰。 - 在其他文件需要用到全局变量的时候,将global.h头文件#include进来。
结言
这个问题的出现,很大原因是C语言太久没有使用过了。而且,在使用c语言或者c++语言的时候,往往因为实验以及课设所需要写的代码不太多,于是养成了一种习惯,一个main.cpp写到结尾。当真正自己去分离自己的模块代码的时候,发现因为定义的全局变量导致编译链接出现错误,实属不该。故写下此文警惕自己!文中可能有不对的地方,希望大家能指正!
文章出自kwongtai'blog,转载请标明出处
转载于:https://www.cnblogs.com/kwongtai/p/8366907.html
解决C/C++语言中全局变量重复定义的问题相关推荐
- 单片机c语言字符,单片机C语言中变量的定义方法解析
描述 1.C语言中变量的定义方法 -C语言中变量定义语法为: #pragma rambank0 :即以关键词#pragma开始,rambank0指明资料区块为第0块. unsigned char m_ ...
- main在c语言中的作用,main函数在C语言中是怎么定义的?有什么作用?
main函数在C语言中是怎么定义的?有什么作用? 更新时间:2019-10-24 13:55 最满意答案 额,main不是程序的最开始啦.拿用glibc的程序来说,C语言执行的过程应该是 _start ...
- 单片机c语言怎么定义字符串,单片机C语言中变量的定义方法解析
1.C语言中变量的定义方法 -C语言中变量定义语法为: #pragma rambank0 :即以关键词#pragma开始,rambank0指明资料区块为第0块. unsigned char m_acc ...
- 在c语言中函数的定义变量的值为,变量定义(C语言中变量的声明和定义)
变量定义(C语言中变量的声明和定义),哪吒游戏网给大家带来详细的变量定义(C语言中变量的声明和定义)介绍,大家可以阅读一下,希望这篇变量定义(C语言中变量的声明和定义)可以给你带来参考价值. 3.函数 ...
- 函数或全局变量重复定义时会怎样?
可能有些朋友第一反应是,那肯定是编译不过喽: // fun.c #include void func() {printf("编程珠玑\n"); }// main.c #includ ...
- c语言中全局变量多线程调用-局部变量、静态局部变量、全局变量与静态全局变量分析
基本概念: 作用域:起作用的区域,也就是可以工作的范围. 代码块:所谓代码块,就是用{}括起来的一段代码. 数据段:数据段存的是数,像全局变量就是存在数据段的 代码段:存的是程序代码,一般是只读的. ...
- go语言中变量的定义和使用
Go语言是静态类型语言,因此变量(variable)是有明确类型的,编译器也会检查变量类型的正确性.在数学概念中,变量表示没有固定值且可改变的数.但从计算机系统实现角度来看,变量是一段或多段用来存储数 ...
- c语言中全局变量内存,C语言——全局变量和局部变量在内存中的区别——及编译后的内存分区【栈-堆-全局存储区-文字常量区-程序代码区】...
目录: 一:全局变量 二:局部变量 三:C语言经过编译之后将内存分为以下几个区域 (1)栈(stack) (2)堆(heap) (3)全局(静态)存储区 (4)文字常量区 (5)程序代码区 四:区别 ...
- C语言中全局变量和局部变量,作用域与生命周期的相关问题。
C语言中变量分为局部变量和全局变量: 在程序的开头定义的是全局变量,在函数内部定义的是局部变量. 在这里涉及2个概念,作用域与生命周期. 作用域指的是描述变量在哪段代码中有效:生命周期指的是变量什么时 ...
最新文章
- 小于60的数中能被1到10整除的数量
- 使用GruntJS构建Web程序 (1)
- myeclipse连接hadoop集群编程及问题解决
- android 自定义view如何控制view的高度_Android自定义View属性动画
- android 拦截点击事件,Android事件拦截机制
- JS ===和==区别
- 修改oracle用户资源限制,RHEL5中安装Oracle11gR2修改用户SHELL限制、环境配置、内核参数...
- python 链表 【测试题】
- 性能优化篇(3):避免空的图片src
- cnblog div+CSS 布局常识 8问
- net core 小坑杂记之配置文件读取(不定期更新)
- LKMs:Loadable Kernel Modules
- java 判断字符串是否是整数
- #ifdef 的使用
- python多线程结束线程_Python线程– Python多线程
- SQLite语句总结
- Ubuntu 12.04下Proftpd FTP服务器配置
- 【亲测有效】macOS无法验证此App不包含恶意软件
- java读取xml转json
- xp计算机找不到音量调节,winxp系统电脑音量无法调节不能调节声音的恢复方案...
热门文章
- JAVA——Map基础知识
- 编写图形界面程序,接受用户输入的5个浮点数据和一个文件目录名,将这五个数据保存在该文件中,再从文件中读取出来并且进行从大到小排序,然后再一次追加保存在该文件中。
- 看看比尔·盖茨在关注什么
- 使用u-boot的tftp下载功能烧写程序到Nand Flash ——韦东山嵌入式Linux学习笔记09
- C语言再学习 -- 再论数组和指针
- 【译】On Path Independence
- 以太坊虚拟机EVM的缺陷与不足
- 【NOIP2013模拟】Vani和Cl2捉迷藏 题解代码
- linux中怎么删除只读变量,【Linux】【问题集锦】如何删除shell只读变量
- java中junit_【Java】Junit快速入门