zoukankan      html  css  js  c++  java
  • 头文件中不能定义变量

    头文件中定义全局变量会出现的问题

    =====本文转载的,在工作中,很受用,特此记录之。======

    直接在头文件中定义全局变量,然后有多个文件包含这个头文件时,编译通过不了,提示重复定义变量

    在头文件中定义全局变量时前面加上关键字static,此时编译会通过但是此时全局变量的作用域不是我们想要的结果!

    测试:

    /* 再头文件中定义一个全局变量 */
    static int a = 0;
    
    /* 然后在两个包含了此头文件的C文件中分别打印这个变量的地址 */
    printf("&a = %x
    ", (uint)&a);

    测试结果你会发现 两个地址不一样 !!原因是它在每个源文件中都有一份这个变量的拷贝,而不是共用一个变量。它的作用域只在一个源文件中,而不是我们想要的跨文件的全局变量。

    怎样得到真正的全局变量?

    在其中一个源文件中定义一个全局变量 
    在其他源文件中使用 extern 声明此变量,就可以使用了 
    或者在 头文件 中使用 extern 声明此变量,然后在需要使用这个变量的源文件中包含此头文件 
    例如:

    /* 在其中一个源文件中定义一个全局变量 */ 
    int a = 0;

    /* 在其他源文件或者头文件中使用 extern 声明此变量 */ 
    extern int a;

    特别注意 结构体变量

    在GCC编译环境下,在头文件中直接定义全局结构体变量是可以的。编译时不会报错,而且它在所有包含这个头文件的源文件中共用一个变量。

    而在windows中的VS编译环境下,不能直接在头文件中定义全局结构体变量,会和普通变量一样报错,提示重复定义变量!

    /* 在头文件中定义一个全局结构体变量 */
    struct test{
        int a;
        char b;
    };
    
    struct test test_1;

    注:这些结果都是我亲自动手测试过的

    所使用的GCC版本:gcc version 4.8.2

    所使用的VS版本:VS2010

    所以建议不要在头文件中定义任何变量

    转自

    https://blog.csdn.net/u014436243/article/details/80564279

  • 相关阅读:
    点双连通分量
    CF 839 E-最大团
    线性基
    CF 859 E
    【bzoj1303】[CQOI2009]中位数图
    【bzoj2282】[Sdoi2011]消防
    【bzoj2654]】tree
    【bzoj2600】 [Ioi2011]ricehub
    【bzoj4027】 [HEOI2015]兔子与樱花
    【bzoj3670】 [Noi2014]动物园
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/12007425.html
Copyright © 2011-2022 走看看