美文网首页程序员
C++项目中全局变量/全局结构体重定义或者多次定义的问题

C++项目中全局变量/全局结构体重定义或者多次定义的问题

作者: 李海游 | 来源:发表于2020-05-03 17:35 被阅读0次

    C++项目是由 .h 文件和 .cpp 文件组成的,如果 A文件(.h&.cpp) 使用了B件(.h&.cpp) 中定义的全局变量或者全局结构体,这时 visual studio 会报错:重定义或者多次定义。

    解决办法:

    一、对于全局变量

    在 B.h 中声明全局变量,并在前面冠上 extern 关键字,然后在 B.cpp 中定义即可。

    int a; //在 .h 中,这个算定义,会报错

    extern int a; //在 .h 中用 extern 声明
    int a;   //在 .cpp 中定义
    

    那有人会问了,在 B.h 中声明的 class B 的数据成员没有用 extern 关键字啊,怎么不报错呢?因为 B 的数据成员是属于类B的,在 B.h 中不用加 extern 也算声明,而不是定义。
    之后 类A只需要 include B.h 即可使用变量 a。

    二、对于全局结构体

    在 B.h 中定义的全局结构体,可以在 A 中直接使用该结构体类型来定义变量;

    // B.h
    struct XXX 
    {
        int a;
            int b;
    };
    
    //A.h
    XXX tmp;
    //A.cpp
    tmp.a=0;
    tmp.b=1;
    

    在 B.h 中定义的全局结构体, A 中使用该类型来定义变量时需要 extern 声明;

    // B.h
    struct XXX 
    {
        int a;
            int b;
    };
    
    //A.h
    extern queue<XXX> tmp;
    //A.cpp
    queue<XXX> tmp;
    
    三、对于全局函数

    同样,也可以在 头文件用 extern 声明,在cpp文件实现。

    // B.h
    extern bool isValid(int y);
    //B.cpp
    bool isValid(int y)
    {
          return y>0? true : false;
    }
    
    总结:
    1. 头文件 (.h) 是该类提供的接口的声明,接口包括该类提供给其它类调用的全局变量和函数,对这些变量和函数都需在 .h 中文件中冠以 extern 关键字声明。
    2. 不要在头文件 (.h) 中定义全局变量。
    3. 其他类要使用该类的变量或者函数,直接包含该类的头文件即可。

    相关文章

      网友评论

        本文标题:C++项目中全局变量/全局结构体重定义或者多次定义的问题

        本文链接:https://www.haomeiwen.com/subject/lrodghtx.html