精华内容
下载资源
问答
  • C++全局变量

    2016-01-31 19:58:04
    C++全局变量的使用有两种方法: 1.在头文件.h中声明一个全局变量如:  extern int a; //尽量不要再头文件中进行定义,否则易造成重定义  在需要该全局变量的文件中包含头文件,这样就可以使用了,但是在使用前...

    C++全局变量的使用有两种方法:

    1.在头文件.h中声明一个全局变量如:

                       extern int a; //尽量不要再头文件中进行定义,否则易造成重定义

         在需要该全局变量的文件中包含头文件,这样就可以使用了,但是在使用前记得定义。

    2.在一个.cpp文件中定义全局变量,如:int a=0;

    在需要改变量的地方,用extern int a;表示改变量已在其他地方定义过,在此处仅仅做声明,这样在该文件中就可以使用了。

    展开全文
  • c++ 全局变量

    2015-12-21 09:30:26
    c++ 全局变量 在主函数的外部定义全局变量 如: int a; 在其他需要使用到全局变量的地方声明它 extern int a; 否则会产生重复定义的错误

    c++ 全局变量

    在主函数的外部定义全局变量

    如: int a;

    在其他需要使用到全局变量的地方声明它

    extern int a;

    否则会产生重复定义的错误

    展开全文
  • C++全局变量的声明和定义

    万次阅读 多人点赞 2012-08-11 09:58:23
    (以下是QT工程代码) 上述代码中g_nDataSize、g_nBufferSize为全局常量,其他为全局变量。 在其他编译单元中使用全局变量时只要包含其所在头文件即可。 以下是Windows控制台应用程序代码示例: 按我们的直观印象,...
     

    (1)编译单元(模块)

        在VC或VS上编写完代码,点击编译按钮准备生成exe文件时,编译器做了两步工作:
    第一步,将每个.cpp(.c)和相应的.h文件编译成obj文件;
    第二步,将工程中所有的obj文件进行LINK,生成最终.exe文件。
     
        那么,错误可能在两个地方产生:
    一个,编译时的错误,这个主要是语法错误;
    一个,链接时的错误,主要是重复定义变量等。
        
        编译单元指在编译阶段生成的每个obj文件。
        一个obj文件就是一个编译单元。
        一个.cpp(.c)和它相应的.h文件共同组成了一个编译单元。
        一个工程由很多编译单元组成,每个obj文件里包含了变量存储的相对地址等。


    (2)声明与定义

        函数或变量在声明时,并没有给它实际的物理内存空间,它有时候可保证你的程序编译通过;
        函数或变量在定义时,它就在内存中有了实际的物理空间。
     
        如果你在编译单元中引用的外部变量没有在整个工程中任何一个地方定义的话,那么即使它在编译时可以通过,在连接时也会报错,因为程序在内存中找不到这个变量。
     
        函数或变量可以声明多次,但定义只能有一次。
     

    (3) extern作用

        作用一:当它与"C"一起连用时,如extern "C" void fun(int a, int b);,则编译器在编译fun这个函数名时按C的规则去翻译相应的函数名而不是C++的。
        作用二:当它不与"C"在一起修饰变量或函数时,如在头文件中,extern int g_nNum;,它的作用就是 声明函数或变量的 作用范围的关键字,其声明的函数和变量可以在本编译单元或其他编译单元中使用。
     
        即B编译单元要引用A编译单元中定义的全局变量或函数时,B编译单元只要包含A编译单元的头文件即可,在编译阶段,B编译单元虽然找不到该函数或变量,但它不会报错,它会在链接时从A编译单元生成的目标代码中找到此函数。
     

    (4)全局变量(extern)

        有两个类都需要使用共同的变量,我们将这些变量定义为全局变量。比如,res.h和res.cpp分别来声明和定义全局变量,类ProducerThread和ConsumerThread来使用全局变量。(以下是QT工程代码)
     
    /**********res.h声明全局变量************/
    #pragma once
    
    #include <QSemaphore>
    
    const int g_nDataSize = 1000; // 生产者生产的总数据量
    const int g_nBufferSize = 500; // 环形缓冲区的大小
    
    extern char g_szBuffer[]; // 环形缓冲区
    extern QSemaphore g_qsemFreeBytes; // 控制环形缓冲区的空闲区(指生产者还没填充数据的区域,或者消费者已经读取过的区域)
    extern QSemaphore g_qsemUsedBytes; // 控制环形缓冲区中的使用区(指生产者已填充数据,但消费者没有读取的区域)
    /**************************/
    
     
    上述代码中g_nDataSize、g_nBufferSize为全局常量,其他为全局变量。
    /**********res.cpp定义全局变量************/
    #pragma once
    #include "res.h"
    
    // 定义全局变量
    char g_szBuffer[g_nBufferSize];
    QSemaphore g_qsemFreeBytes(g_nBufferSize);
    QSemaphore g_qsemUsedBytes;
    /**************************/
    
     
    在其他编译单元中使用全局变量时只要包含其所在头文件即可。
    /**********类ConsumerThread使用全局变量************/
    #include "consumerthread.h"
    #include "res.h"
    #include <QDebug>
    
    ConsumerThread::ConsumerThread(QObject* parent)
        : QThread(parent) {
    
    }
    
    ConsumerThread::ConsumerThread() {
    
    }
    
    ConsumerThread::~ConsumerThread() {
    
    }
    
    void ConsumerThread::run() {
         for (int i = 0; i < g_nDataSize; i++) {
              g_qsemUsedBytes.acquire();              
              qDebug()<<"Consumer "<<g_szBuffer[i % g_nBufferSize];
              g_szBuffer[i % g_nBufferSize] = ' ';
              g_qsemFreeBytes.release();
             
         }
         qDebug()<<"&&Consumer Over";
    }
    /**************************/
    

        也可以把全局变量的声明和定义放在一起,这样可以防止忘记了定义,如上面的extern char g_szBuffer[g_nBufferSize]; 然后把引用它的文件中的#include "res.h"换成extern char g_szBuffer[];。
        但是这样做很不好,因为你无法使用#include "res.h"(使用它,若达到两次及以上,就出现重定义错误;注:即使在res.h中加#pragma once,或#ifndef也会出现重复定义,因为每个编译单元是单独的,都会对它各自进行定义),那么res.h声明的其他函数或变量,你也就无法使用了,除非也都用extern修饰,这样太麻烦,所以还是推荐使用.h中声明,.cpp中定义的做法。


    (5)静态全局变量(static)

        注意使用static修饰变量,就不能使用extern来修饰,即static和extern不可同时出现。
        static修饰的全局变量的声明与定义同时进行,即当你在头文件中使用static声明了全局变量,同时它也被定义了。
        static修饰的全局变量的作用域只能是本身的编译单元。在其他编译单元使用它时,只是简单的把其值复制给了其他编译单元,其他编译单元会另外开个内存保存它,在其他编译单元对它的修改并不影响本身在定义时的值。即在其他编译单元A使用它时,它所在的物理地址,和其他编译单元B使用它时,它所在的物理地址不一样,A和B对它所做的修改都不能传递给对方。
        多个地方引用静态全局变量所在的头文件,不会出现重定义错误,因为在每个编译单元都对它开辟了额外的空间进行存储。
    以下是Windows控制台应用程序代码示例:
     
    /***********res.h**********/
    static char g_szBuffer[6] = "12345";
    void fun();
    /************************/
    
     
    /***********res.cpp**********/
    #include "res.h"
    #include <iostream>
    using namespace std;
    
    void fun() {
         for (int i = 0; i < 6; i++) {
              g_szBuffer[i] = 'A' + i;
         }
         cout<<g_szBuffer<<endl;
    }
    /************************/
    
    /***********test1.h**********/
    void fun1();
    /************************/
    
     
    /***********test1.cpp**********/
    #include "test1.h"
    #include "res.h"
    #include <iostream>
    using namespace std;
    
    void fun1() {
        fun();
    
         for (int i = 0; i < 6; i++) {
              g_szBuffer[i] = 'a' + i;
         }
         cout<<g_szBuffer<<endl;
    }
    /************************/
    

    /***********test2.h**********/
    void fun2();
    /************************/
    

    /***********test2.cpp**********/
    #include "test2.h"
    #include "res.h"
    #include <iostream>
    using namespace std;
    
    void fun2() {
         cout<<g_szBuffer<<endl;
    }
    /************************/
    
     
    /***********main.cpp**********/
    #include "test1.h"
    #include "test2.h"
    
    int main() {
         fun1();
         fun2();
    
         system("PAUSE");
         return 0;
    }
    /************************/
    
     
    运行结果如下:
     
        按我们的直观印象,认为fun1()和fun2()输出的结果都为abcdef,可实际上fun2()输出的确是初始值。然后我们再跟踪调试,发现res、test1、test2中g_szBuffer的地址都不一样,分别为0x0041a020、0x0041a084、0x0041a040,这就解释了为什么不一样。
     
        注:一般定义static 全局变量时,都把它放在.cpp文件中而不是.h文件中,这样就不会给其他编译单元造成不必要的信息污染。

    (6)全局常量(const)

        const单独使用时,其特性与static一样(每个编译单元中地址都不一样,不过因为是常量,也不能修改,所以就没有多大关系)。
        const与extern一起使用时,其特性与extern一样。
    extern const char g_szBuffer[];      //写入 .h中
    const char g_szBuffer[] = "123456"; // 写入.cpp中
    
    展开全文
  • C++全局变量操作

    千次阅读 2017-02-06 09:20:20
    C++全局变量
    全局变量操作主要有 两种
    一、重新建立一个类。
    首先,我们建立一个.h和一个.cpp文件。在.h中定义一个类,类里面定义public成员,全部为static。然后在.cpp文件中,对这些变量进行初始化。
    .h文件如下
    #ifndef GLOBAL_H
    #define GLOBAL_H
    class Global// This is available in all editors.
    {
    public:
    static bool g_loginFlag;
    static QString g_path;
    static QString g_name;
    static bool g_isPlay;
    static int g_delayTime;
    static int g_loopTime;
    };
    #endif // GLOBAL_H
    .cpp文件如下
    #include "global.h"
    bool Global::g_loginFlag=false;
    QString Global::g_path = "";
    QString Global::g_name = "";
    bool Global::g_isPlay = false;
    int Global::g_delayTime = 10;
    int Global::g_loopTime = 1;
    二、extern方法,不需要定义一个类,但是同样需要一个.h和一个.cpp文件
    .h文件
    #ifndef GOLBALOBJECT
    #define GOLBALOBJECT
    static RunConfig g_Config;
    extern RobotFileConfiguration g_robotFileConfiguration;
    extern RobotFileConfiguration g_sendIOConfiguration;
    #endif // GOLBALOBJECT
    .cpp文件
    #include "golbalobject.h"
    RobotFileConfiguration g_robotFileConfiguration={0};
    RobotFileConfiguration g_sendIOConfiguration ={0};

    展开全文
  • C++ 全局变量、局部变量、静态全局变量、静态局部变量的区别 C++ 变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为 6 种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和...
  • C++全局变量的声明和定义.pdf
  • 本篇文章是对C++全局变量的声明与定义进行了详细的分析介绍,需要的朋友参考下
  • 今天小编就为大家分享一篇解决C++全局变量只能初始化不能赋值的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • C++全局常量变量的定义方法

    千次阅读 2016-03-15 09:58:33
    1 全局变量(extern) 当两个类都需要使用共同的变量,我们将这些变量定义为全局变量。比如,res.h和res.cpp分别来声明和定义全局变量,类ProducerThread和ConsumerThread来使用全局变量。 /**********res.h声明...
  • C++全局变量与全局静态变量: <em><strong><span style="color:#ff0000">C++ 全局变量和全局静态变量的根本区别还是作用域的区别</span></strong></em> 1.全局变量是不显示...
  • C++全局变量与静态变量的构造与析构顺序 本人是C++的初学者,将自己学习过程中的一些收获记录在CSDN上,一方面能为大家提供帮助,另一方面能够方便自己日后查看。 关于在C++全局变量与静态变量的构造与析构顺序,...
  • 在讨论全局变量之前我们先要明白几个基本的概念 1. 编译单元 (模块 ) 在 IDE 开发工具大行其道的今天对于编译的一些概念很多人已经不再清楚了很多程序 员最怕的就是处理连接错误 (LINK ERROR, 因为它不像编译错误...
  • C++ 全局变量、静态全局变量、局部变量、静态局部变量的使用,整理表格如下:分类 全局变量 静态全局变量(static) 局部变量(auto) 静态局部变量(static) 作用域 全局作用域(extern) 文件作用域(当前文件) 局部作用域...
  • 全局变量的使用方法 参考链接:https://www.cnblogs.com/Dageking/p/3185230.htmlhttps://blog.csdn.net/hi_baymax/article/details/82425457 强烈建议使用xxx.h和xxx.cpp的形式创建全局变量全局函数。.h和....
  • 函数或变量在声明时,并没有给它实际的物理内存空间,它有时候可以保证你的程序编译通过, 但是当函数或变量定义的时候,它就在内存中有了实际的物理空间与区别。
  • 注意:本文所说的全局变量指的是 variables with static storage,措词来自 c++ 的语言标准文档。  什么时候初始化  根据 C++ 标准,全局变量的初始化要在 main 函数执行前完成,常识无疑,但是这个说法有点含糊...
  • c++全局变量与静态变量

    千次阅读 2019-03-29 19:12:12
    全局变量和和由static修饰的静态变量都被储存在全局数据区。全局数据区的内存在程序运行时会被全部置'0'.这不同于局部变量,局部变量在栈上分配内存,但此块内存一般不为零,且编译器不会在局部变量被声明的地方为其...
  • C++全局变量

    2020-05-23 10:00:31
    以一种更安全,更健壮的方式来表示全局变量的方法,是将其封装成全局变量类,主要涉及以下的知识点: C++类 类中static成员变量 类中static成员函数 类中的成员函数会被自动视为inline内联函数 用pass-by-...
  • 今天上午写C++代码,被神马全局变量和静态全局变量困住了,出现了各种“重定义”和“链接”相关的error。到底在哪里声明,在哪里定义,哪里使用extern?
  • 关于C++全局变量声明的问题

    千次阅读 2016-05-11 17:07:36
    关于C++全局变量声明的问题在Visual Studio 2015中, 通过实际测试得出以下几点结论:如果两个头文件中定义了相同名字的全局变量,当同时包含这两个头文件时会在编译阶段报重定义错误。test1.h#pragma once int test;...
  • 在一个源文件A.cpp中声明了一个全局常量,在源文件B.cpp中定义了该全局常量,结果在A.cpp中使用全局常量报错了,错误如下: error LNK2001: 无法解析的外部符号 “int const g_iCount” (?g_iCount@@3HB) fatal ...
  • 全局变量、静态局部变量、局部变量、静态全局变量 全局变量 全局作用域 全局变量只需在一个源文件中定义,就可以作用于所有的源文件。其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局...
  • 从上面的定义来看C++全局变量与局部变量就很好区分了。局部变量只能被函数内部或者代码块内部的语句使用,而全局变量的值在程序的整个生命周期内都是有效的。全局变量可以被任何函数访问,在整个程序中都是可用的。 ...
  • C++ 变量作用域1、名词解释2、全局变量和局部变量3、局部变量的值会覆盖全局变量的值4、我们怎么才能在局部变量全局变量名称相同的情况下调用全局变量呢?5、初始化局部变量全局变量 1、名词解释 作用域是程序的...
  • 1.两者作用域不同,全局变量的作用域是整个工程项目,静态全局变量作用域只在当前文件 2.全局变量在其他文件引用时,需使用extern声明 3.全局变量和静态全局变量都存储在静态存储区
  • C++全局变量内存分配和初始化顺序 1.局部变量规则 局部变量是在栈空间上,内存分配的顺序和代码的顺序是一致的 2.全局变量规则 2.1 初始化的全局变量 一般来说,对于初始化的全局变量,编译器遇到之后知道这是一个...
  • 问题:全局变量、局部变量、静态变量常量在内存中的区别? 问集中变量在内存中的区别,首先我们要知道一个C/C++程序在运行时内存的布局是什么样的,如下图: 一个运行的程序在内存中主要表示为这四种空间区域...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 242,378
精华内容 96,951
关键字:

c++全局常量

c++ 订阅