前言

今天,在整理自己的代码的时候,考虑到我写的代码从一至终都是在一个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. 小于60的数中能被1到10整除的数量
  2. 使用GruntJS构建Web程序 (1)
  3. myeclipse连接hadoop集群编程及问题解决
  4. android 自定义view如何控制view的高度_Android自定义View属性动画
  5. android 拦截点击事件,Android事件拦截机制
  6. JS ===和==区别
  7. 修改oracle用户资源限制,RHEL5中安装Oracle11gR2修改用户SHELL限制、环境配置、内核参数...
  8. python 链表 【测试题】
  9. 性能优化篇(3):避免空的图片src
  10. cnblog div+CSS 布局常识 8问
  11. net core 小坑杂记之配置文件读取(不定期更新)
  12. LKMs:Loadable Kernel Modules
  13. java 判断字符串是否是整数
  14. #ifdef 的使用
  15. python多线程结束线程_Python线程– Python多线程
  16. SQLite语句总结
  17. Ubuntu 12.04下Proftpd FTP服务器配置
  18. 【亲测有效】macOS无法验证此App不包含恶意软件
  19. java读取xml转json
  20. xp计算机找不到音量调节,winxp系统电脑音量无法调节不能调节声音的恢复方案...

热门文章

  1. JAVA——Map基础知识
  2. 编写图形界面程序,接受用户输入的5个浮点数据和一个文件目录名,将这五个数据保存在该文件中,再从文件中读取出来并且进行从大到小排序,然后再一次追加保存在该文件中。
  3. 看看比尔·盖茨在关注什么
  4. 使用u-boot的tftp下载功能烧写程序到Nand Flash ——韦东山嵌入式Linux学习笔记09
  5. C语言再学习 -- 再论数组和指针
  6. 【译】On Path Independence
  7. 以太坊虚拟机EVM的缺陷与不足
  8. 【NOIP2013模拟】Vani和Cl2捉迷藏 题解代码
  9. linux中怎么删除只读变量,【Linux】【问题集锦】如何删除shell只读变量
  10. java中junit_【Java】Junit快速入门