zoukankan      html  css  js  c++  java
  • 解决C/C++语言中全局变量重复定义的问题

    前言

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


    遇到的问题

    我的做法是:

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

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

    error.png


    问题出现的原因

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

    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,转载请标明出处

  • 相关阅读:
    Hadoop集群(三) Hbase搭建
    Hadoop集群(二) HDFS搭建
    Hadoop集群(一) Zookeeper搭建
    Redis Cluster 添加/删除 完整折腾步骤
    Redis Cluster在线迁移
    Hadoop分布式HA的安装部署
    Describe the difference between repeater, bridge and router.
    what is the “handover” and "soft handover" in mobile communication system?
    The main roles of LTE eNodeB.
    The architecture of LTE network.
  • 原文地址:https://www.cnblogs.com/kwongtai/p/8366907.html
Copyright © 2011-2022 走看看