前言

今天,在整理自己的代码的时候,考虑到我写的代码从一至终都是在一个cpp文件里面。于是,想把自己的代码中的各个模块分离开来,以便更好地阅读和管理。


遇到的问题

我的做法是:

  1. 宏定义、结构体定义、函数声明以及全局变量定义放到一个head.h头文件中
  2. 函数的定义放到head.cpp中
  3. main函数放到main.cpp中

然而却报错了,提示xxx变量在*.obj文件中已定义


问题出现的原因

为什么会出现这种情况呢?

  1. 首先单个文件的编译是独立的。在head.cpp编译到head.obj,main.cpp编译到main.obj。这个过程没有报错,也就是说明编译过程是没有问题的。
  2. 接下来是obj的链接。在链接main.obj与head.obj的时候,此时编译器发现head.obj为这些全局变量分配了内存空间,而在main.obj中也为这些全局变量分配了内存空间。
  3. 同样一个变量却出现了两个不同的内存地址。于是编译器报错。

不是办法的办法

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

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

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


真正的解决方法

  1. 把全局变量定义放到head.cpp文件中。
  2. 在head.h存放全局变量的声明,同时每个声明前用extern去修饰。

我的个人想法

我觉得为了能更加分离全局变量,可以做的一个做法是:

  1. 全局变量定义依旧放在head.cpp中。
  2. 新建一个global.h的头文件,存放全局变量的声明,同时每个声明前用extern去修饰。
  3. 在其他文件需要用到全局变量的时候,将global.h头文件#include进来。

结言

这个问题的出现,很大原因是C语言太久没有使用过了。而且,在使用c语言或者c++语言的时候,往往因为实验以及课设所需要写的代码不太多,于是养成了一种习惯,一个main.cpp写到结尾。当真正自己去分离自己的模块代码的时候,发现因为定义的全局变量导致编译链接出现错误,实属不该。故写下此文警惕自己!文中可能有不对的地方,希望大家能指正!

文章出自kwongtai'blog,转载请标明出处

转载于:https://www.cnblogs.com/kwongtai/p/8366907.html

解决C/C++语言中全局变量重复定义的问题相关推荐

  1. 单片机c语言字符,单片机C语言中变量的定义方法解析

    描述 1.C语言中变量的定义方法 -C语言中变量定义语法为: #pragma rambank0 :即以关键词#pragma开始,rambank0指明资料区块为第0块. unsigned char m_ ...

  2. main在c语言中的作用,main函数在C语言中是怎么定义的?有什么作用?

    main函数在C语言中是怎么定义的?有什么作用? 更新时间:2019-10-24 13:55 最满意答案 额,main不是程序的最开始啦.拿用glibc的程序来说,C语言执行的过程应该是 _start ...

  3. 单片机c语言怎么定义字符串,单片机C语言中变量的定义方法解析

    1.C语言中变量的定义方法 -C语言中变量定义语法为: #pragma rambank0 :即以关键词#pragma开始,rambank0指明资料区块为第0块. unsigned char m_acc ...

  4. 在c语言中函数的定义变量的值为,变量定义(C语言中变量的声明和定义)

    变量定义(C语言中变量的声明和定义),哪吒游戏网给大家带来详细的变量定义(C语言中变量的声明和定义)介绍,大家可以阅读一下,希望这篇变量定义(C语言中变量的声明和定义)可以给你带来参考价值. 3.函数 ...

  5. 函数或全局变量重复定义时会怎样?

    可能有些朋友第一反应是,那肯定是编译不过喽: // fun.c #include void func() {printf("编程珠玑\n"); }// main.c #includ ...

  6. c语言中全局变量多线程调用-局部变量、静态局部变量、全局变量与静态全局变量分析

    基本概念: 作用域:起作用的区域,也就是可以工作的范围. 代码块:所谓代码块,就是用{}括起来的一段代码. 数据段:数据段存的是数,像全局变量就是存在数据段的 代码段:存的是程序代码,一般是只读的. ...

  7. go语言中变量的定义和使用

    Go语言是静态类型语言,因此变量(variable)是有明确类型的,编译器也会检查变量类型的正确性.在数学概念中,变量表示没有固定值且可改变的数.但从计算机系统实现角度来看,变量是一段或多段用来存储数 ...

  8. c语言中全局变量内存,C语言——全局变量和局部变量在内存中的区别——及编译后的内存分区【栈-堆-全局存储区-文字常量区-程序代码区】...

    目录: 一:全局变量 二:局部变量 三:C语言经过编译之后将内存分为以下几个区域 (1)栈(stack) (2)堆(heap) (3)全局(静态)存储区 (4)文字常量区 (5)程序代码区 四:区别 ...

  9. C语言中全局变量和局部变量,作用域与生命周期的相关问题。

    C语言中变量分为局部变量和全局变量: 在程序的开头定义的是全局变量,在函数内部定义的是局部变量. 在这里涉及2个概念,作用域与生命周期. 作用域指的是描述变量在哪段代码中有效:生命周期指的是变量什么时 ...

最新文章

  1. R语言glm拟合logistic回归模型实战:基于glm构建逻辑回归模型及模型系数统计显著性分析、每个预测因子对响应变量的贡献
  2. 1111B - Average Superhero Gang Power
  3. CakePHP 2.x CookBook 中文版 第二章 安装
  4. java选择循环_java选择和循环结构
  5. ✳编程求当n≤100时,n!的准确值
  6. 牛客练习赛89——牛牛小数点(未解决)
  7. java写入文件编码格式为ansi_Windows10 bat批处理删除 快速打开文件夹 固定到开始菜单或任务栏...
  8. vc2005运行库彻底卸载_VC运行库安装卸载工具-Visual C ++ AIO(VC运行库安装卸载工具)下载 v2019.05.21官方版--pc6下载站...
  9. 【Dart语言第1篇】基础学习
  10. Word一行排列多个图片并插入题注
  11. H263、H264和3GPP、MPEG4是什么关系
  12. 一、概述(知识图谱构建射雕人物关系)
  13. 0 13 amp 0 17c语言,急等网址跳转大神,无用网址尾巴处理:index.php?id=13amp;amp;rew...
  14. C#中悲观锁和乐观锁
  15. 计算机服务器排名,2019服务器CPU天梯图 多路CPU性能排名
  16. Go之Benchmark
  17. 分布式主键生成设计策略
  18. 旭鑫胜XS016全集成MCU+微型IPM构架无线充电方案
  19. asio学习之一:asio下载安装
  20. 约束优化:PHR-ALM 增广拉格朗日函数法

热门文章

  1. Git错误non-fast-forward后的冲突解决
  2. 解惑(二)----- 如何通俗地理解Python中的if __name__ == ‘__main__‘
  3. C++ const修饰符和指针
  4. 【译】Private AI — Federated Learning with PySyft and PyTorch
  5. 【译】A quick list of new enterprise features in iOS 13, iPadOS, and macOS 10.15 Catalina
  6. 【译】From Smart Contracts to Courts with not so Smart Judges
  7. 区块链共识算法 PBFT(拜占庭容错)、PAXOS、RAFT简述
  8. 详解DPoS共识算法
  9. 技术讨论 | 一次尚未完成的薅羊毛行动
  10. 图解LSTM神经网络架构及其11种变体(附论文)