精华内容
下载资源
问答
  •  在global.h声明和定义变量  int sharedData = 9;  编译出错  Building target: CTest  Invoking: GCC C++ Linker  g++ -o "CTest" ./src/CTest.o ./src/global.o  ./src/global.o:(.data+0x0): `...
  • C++全局变量声明与定义

    千次阅读 2019-06-14 20:43:00
    文章目录编译单元(模块)声明与定义extern作用静态全局变量(static)全局常量(const) 编译单元(模块) 在VC或VS上编写完代码,点击编译按钮准备生成exe文件时,编译器做了两步工作: 将每个.cpp(.c)和相应的.h...

    编译单元(模块)

    在VC或VS上编写完代码,点击编译按钮准备生成exe文件时,编译器做了两步工作:

    • 将每个.cpp(.c)和相应的.h文件编译成obj文件;
    • 将工程中所有的obj文件进行LINK,生成最终.exe文件。

    那么,错误可能在两个地方产生:

    • 编译时的错误,这个主要是语法错误;
    • 链接时的错误,主要是重复定义变量等。

    编译单元指在编译阶段生成的每个obj文件。

    • 一个obj文件就是一个编译单元。
    • 一个.cpp(.c)和它相应的.h文件共同组成了一个编译单元。
    • 一个工程由很多编译单元组成,每个obj文件里包含了变量存储的相对地址等。

    声明与定义

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

    extern作用

    1. 当它与"C"一起连用时,如extern "C" void fun(int a, int b);,则编译器在编译fun这个函数名时按C的规则去翻译相应的函数名而不是C++的。(C函数不能重载)
    2. 当它不与"C"在一起修饰变量或函数时,如在头文件中,extern int g_nNum;,它的作用就是声明函数或变量的作用范围的关键字,其声明的函数和变量可以在本编译单元或其他编译单元中使用。

    note:可以把全局变量的声明和定义放在一起,这样可以防止忘记了定义,如上面的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中定义的做法

    静态全局变量(static)

    注意使用static修饰变量,就不能使用extern来修饰,即static和extern不可同时出现。
    static修饰的全局变量的声明与定义同时进行,即当你在头文件中使用static声明了全局变量,同时它也被定义了
    static修饰的全局变量的作用域只能是本身的编译单元。在其他编译单元使用它时,只是简单的把其值复制给了其他编译单元,其他编译单元会另外开个内存保存它,在其他编译单元对它的修改并不影响本身在定义时的值。即在其他编译单元A使用它时,它所在的物理地址,和其他编译单元B使用它时,它所在的物理地址不一样,A和B对它所做的修改都不能传递给对方。
    多个地方引用静态全局变量所在的头文件,不会出现重定义错误,因为在每个编译单元都对它开辟了额外的空间进行存储。

    全局常量(const)

    const单独使用时,其特性与static一样(每个编译单元中地址都不一样,不过因为是常量,也不能修改,所以就没有多大关系)。
    const与extern一起使用时,其特性与extern一样。

    extern const char g_szBuffer[];      //写入 .h中
    const char g_szBuffer[] = "123456"; // 写入.cpp中
    
    展开全文
  • C++语言中,变量有且只能有一次定义,但是可以声明多次,使用变量前必须定义或声明。 再说到这些变量的声明与定义前,要知道这些变量的链接性: 外部全局变量 外部连接性 可以被extern 静态全局变量(static) ...

    头文件中变量如果没有初始化就是声明;初始化了就是定义。在C++语言中,变量有且只能有一次定义,但是可以声明多次,使用变量前必须定义或声明。

    再说到这些变量的声明与定义前,要知道这些变量的链接性:

    外部全局变量                  外部连接性   可以被extern

    静态全局变量(static)  内部连接性   不能被extern

    常全局变量(const)      内部连接性  在之前加上extern就变成了外部连接性,就可以被其他的文件extern了


    声明:(可以放在头文件)没有开辟内存的定义,类型定义,比如类的定义,结构体的定义,它是定义一个数据类型而

    定义:(不可放在头文件)开辟了内存的定义,数据定义,比如类对象定义,变量定义

    一般来说:

    不分配内存的,放在头文件
    分配内存的放在cpp文件,防止重复定义,当然也要看变量的连接性,内部连接性的可以放在头文件定义。

      变量、函数、类,在使用之前都必须声明,包含头文件,如果a.h包含了b.h,在a.h里面就对b.h里面的声明重新声明了,这也是不能在头文件里面定义变量与函数的原因(防止重复定义),当然内部链接性的变量和内联函数除外。


           C++是不允许在头文件里定义一个外部全局变量(声明可以,比如在源文件定义,在头文件extern声明,像int a;这样不算声明,是定义,全局变量默认赋值0),因为当这个头文件被多个别的文件(.cpp或.h)包含的时候,会重复定义这个全局变量,而外部全局变量是外部连接性,别的文件可以互相访问地址,这个与变量有且只能有一次定义(单一定义规则)矛盾,会造成编译出错,即使你在其他的文件里使用extern都不行,因为是其他文件包含这个定义了外部全局变量的头文件。若是真的需要外部全局变量,可以在源文件定义一个外部全局变量,在该源文件的头文件extern声明这个变量,或者别的包含这个头文件的文件里extern声明这个变量,这样变量只是在源文件你定义一次,其他地方的都只是声明,调用的地址还是那个定义了的源文件里面开辟的------如:b.h,c.h都包含了a.h,这时候可以在a.cpp里面定义全局,在a.h文件extern下就行,这样b.h,c.h就都能用了,或者在b.h,c.h以及他们的源文件extern也可以。

    对于static,const全局变量,则可以定义在头文件里,因为它们的连接性为内部,它们的地址只有在本文件里访问,即使这个头文件被其他的文件(.cpp或.h)包含,虽然重复定义,  c++ primer里讲的const变量定义时默认为文件的局部变量(内部连接性),当头文件中定义了const变量后每个包含该头文件的文件都有了自己的const变量。这与单一定义规则不矛盾,static也是同样,但是const的连接性可变,在const变量前面加上extern后,就变成全局变量,外部连接性,这时候要注意包含的问题。  而在.cpp文件里定义的const或者static变量,是不可以被别的文件访问的。(注意.h    .cpp等之间的包含关系)--------------------------------extern用于互不包含的文件里,或者被包含的文件。
    包含意味着重新定义,但是对于互不包含的文件不可以定义同名的外部全局变量,外部全局变量属于外部连接性,这样就导致了重定义!当然加上static或者const就可以,这里有个全局存储区的区分------http://blog.csdn.net/u010177010/article/details/50737429,内部链接的变量地址所在的存储区跟外部链接所在的存储区是不同的,但是都属于全局存储区!

        对于static,const全局变量,如果在两个互不包含的文件里定义了相同的变量,第三个文件包含了这两个文件,就会出错,因为包含意味着重定义,同个内存块不可能有两个相同名字的内存。

    总之,编译是否出错,看的是  变量的连接性以及是否重定义


    展开全文
  • C++定义全局变量的方法

    千次阅读 2019-09-06 14:38:40
    我们想定义一个全局变量,能够在多个文件中使用 //hello.h #ifndef HELLO_H_ #define HELLO_H_ extern int a; void fun (); #endif //hello.c #include <stdio.h> #include "hello.h" int a = 0; void ...

    我们想定义一个全局变量,能够在多个文件中使用

    //hello.h
    
    #ifndef HELLO_H_
    #define HELLO_H_
    extern int a;
    void fun ();
    #endif
    
    //hello.c
    
    #include <stdio.h>
    #include "hello.h"
    int a = 0;
    void fun () {
    	a = 1;
    	printf("%d\n",a);
    }
    
    
    //main.c
    
    
    
    #include <stdio.h>
    #include "hello.h"
    int main () {
    	fun();
    	a = 10;
    	printf("%d\n",a);
    	return 0;
    }
    
    

    输出结果为1,10;
    extern关键字来声明变量为外部变量,而为什么要在hello.h文件中已经extern int a了还要再在hello.c文件中定义int a呢?

    这是因为extern仅仅是作为一个声明,声明我要定义一个外部全局变量a可以在其他文件和模块中使用,但此时并为给a分配空间。
    而int a = 0;则才是真正对a的定义,为其分配空间。
    那么问题又来了,我们为什么不写成extern int a = 0;的形式不是更简单吗?

    这就涉及到c的一个基本知识点了也就是extern int a = 0和int a = 0同样都是对a的定义,只不过第二种是省略了extern而已。

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

    万次阅读 2018-12-07 22:00:23
    全局变量在整个源文件的作用域都是有效的,只需要在一个源文件中定义全局变量,在其他不包含全局变量定义的源文件中用extern关键字再次声明这个全局变量即可。 也可以在一个源文件中定义这个全局变量,在头文件中用...

    1.全局变量

    全局变量在整个源文件的作用域都是有效的,只需要在一个源文件中定义全局变量,在其他不包含全局变量定义的源文件中用extern关键字再次声明这个全局变量即可。

    也可以在一个源文件中定义这个全局变量,在头文件中用extern关键字再次声明这个全局变量,如果其它源文件要用到这个全局变量,只需要包含这个头文件就可以直接使用了。

    例:我在class1中定义一个全局变量数组a[20],在class1中对数组a的赋值,我想在class2中使用,其方法如下。

    class1.h文件:

    #include <stdio.h>
    #include <iostream>
    using namespace std;
    extern int a[20];    //extern 关键字再次声明这个全局变量
    class class1
    {
    public:
    	class1();
    	~class1();
    
    	static int c;
    
    };
    

    class1.cpp文件:

    #include "class1.h"
    
    int a[20];	//全局变量
    
    int class1::c = 1;	//类中静态变量的初始化
    
    class1::class1()
    {
    	cout << "class1中数组a的值:";
    	for (int i = 0; i < 20; i++) {
    		a[i] = i + 1;
    		cout << " " << a[i];
    	}
    	c = 2;
    	cout << "\n";
    }
    
    class1::~class1()
    {
    }

    class2.h文件:

    #pragma once
    #include "class1.h"
    
    class class2
    {
    public:
    	class2();
    	~class2();
    private:
    	class1 c1;
    	class1 c2;
    };

    class2.cpp文件:

    #include "class2.h"
    
    class2::class2()
    {
    	cout << "c1.c的值为:" << c1.c << "     c2.c的值为:" <<c2.c<< endl;
    	c1.c = 5; 
    	cout << "c1.c的值为:" << c1.c << "     c2.c的值为:"<< c2.c << endl;
    	cout << "class2中数组a的值:";
    	for (int i = 0; i < 20; i++) {
    		cout << " " << a[i];
    	}
    	cout << endl;
    }
    
    class2::~class2()
    {
    }
    #include<stdio.h>
    #include<iostream>
    #include <string>
    #include<math.h>
    #include "class1.h"
    #include "class2.h"
    using namespace std;
    
    int main()
    {
    	class1 a1;
    	class2 a2;
    	system("pause");
    	return 0; 
    }

    运行结果:

    class1中对数组a的赋值,在class2中可以成功取出来。

    在这个程序中还对类中的静态变量做了验证,类中声明了静态成员变量,在类中,静态成员变量可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。上面代码中,在对class1的对象c1指向的c赋值为5后,对象c2指向的c也变成了5,说明静态成员变量实现了类对象间数据的共享,该类生成的对象中的静态成员便改良指向同一个地址。

     


    2.static全局变量

    static和extern来修饰同一个变量,即static和extern不可同时出现。

     static修饰的全局变量是声明与定义同时进行,就是说只要你在头文件中使用static声明一个全局变量,同时它也就被定义了。

    static修饰的全局变量是文件作用域的,即他只能在当前文件中有用。在其他文件中使用时,其他编译单元会另外开个内存保存它,在其他编译单元对它的修改并不影响它本身值。因为它所在的物理地址和其他编译单元使用它时的物理地址不一样。

     

     

    展开全文
  • C++中类使用全局变量

    2015-07-07 08:37:42
    C++中,声明一个类,并且定义一个全局变量,练习全局变量的使用。注意全局变量的使用技巧和方法。
  • c++全局变量的正确声明

    千次阅读 2016-04-12 10:35:51
    C++全局变量声明错误情况 造成LNK2005错误主要有以下几种情况:   1.重复定义全局变量。可能存在两种情况:   A、对于一些初学编程的程序员,有时候会以为需要使用全局变量的地方就可以使用定义申明...
  • C++全局变量声明与定义

    千次阅读 2016-11-09 23:26:16
    1. header1.h中声明全局变量,header1.cpp中定义全局变量 // header1.h #ifndef HEADER1_H_ #define HEADER1_H_ extern int g_n;// 头文件中必须加extern声明全局变量,不赋值 //int g_o;错误 //int g_o = 10;错误 ...
  • 1.cpp const int point=50; //point 里放的是特征点的数量 fun1(){...} 2.h extern const int point; 3.cpp #include"2.h" ... 4.h:“point”:未声明的标识符 我该怎么修改才能满足我的使用情况呢?
  • C++全局变量的使用

    2020-06-03 15:09:18
    C++全局变量的定义与使用做一下下面简单的记录,方便日后查阅,也与大家一起学习。 1.全局变量声明; [1]在头文件.h中进行声明,如果在此文件之外也要使用该变量,则在变量声明前加extern: extern int a; ...
  • 在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的。同样,在复合语句中定义的变量只在本复合语句范围内有效。这称为局部变量...
  • 宏定义、结构体定义、函数声明以及全局变量定义放到一个head.h头文件中 函数的定义放到head.cpp中 main函数放到main.cpp中 然而却报错了,提示xxx变量在*.obj文件中已定义 问题出现的原因 为什么会出现这种...
  • C++extern全局变量

    千次阅读 2018-11-15 20:02:55
    C++编写多文件时一直有个疑惑, 就是多个文件能否在一个头文件当中声明全局变量, 然后其他文件可以一起用. 但是以前没有研究过, 这样子做总会出错, 今天来总结一下. 声明与定义: 对与变量来讲, 一般情况两者是没有...
  • 在所有函数外部定义的变量称为全局变量(Global Variable) 全局变量的默认作用域是整个程序,也就是所有的代码文件,包括源文件(.c文件)和头文件(.h文件)。如果给全局变量加上 static 关键字,它的...
  • C++全局变量声明和定义

    万次阅读 多人点赞 2012-08-11 09:58:23
    比如,res.h和res.cpp分别来声明和定义全局变量,类ProducerThread和ConsumerThread来使用全局变量。(以下是QT工程代码) 上述代码中g_nDataSize、g_nBufferSize为全局常量,其他为全局变量。 在其他编译单元中使用...
  • 这样的操作,在vc中,是可以编译通过的,这种情况大家都比较模糊并且需要注意,数组与指针类似,但并不等于说对数组的声明变量就是指针。上面所说的的程序在运行时发现了问题,在引用声明的那个文件中...
  • 本篇文章是对C++全局变量声明与定义进行了详细的分析介绍,需要的朋友参考下
  • c++全局变量与静态变量

    千次阅读 2019-03-29 19:12:12
    全局变量和和由static修饰的静态变量都被储存在全局数据区。全局数据区的内存在程序运行时会被全部置'0'.这不同于局部变量,局部变量在栈上分配内存,但此块内存一般不为零,且编译器不会在局部变量被声明的地方为其...
  • 1、先在.h头文件中用关键字extern声明全局变量(声明要放在类以外) extern QString usr_str; extern QString pwd_str; 2、在.cpp文件中包含声明了全局变量并定义全局变量 #include "qwmianwind.h"//这个是声明...
  • C++中,全局变量只能声明、初始化,而不能赋值 也就是说,下面这样是不被允许的: #include using namespace std; int a; a = 2; int main() { return 0; } 错误提示是: C++ requires a type specifier for all...
  • 全局变量的使用方法 参考链接:... 强烈建议使用xxx.h和xxx.cpp的形式创建全局变量和全局函数。.h和.cpp分别来声明和定义全局变量。此处建议,.h文件最好只写变量和函数的声...
  • 首先声明一点,标题中说的全局变量是指的这样的需求:我们需要一个对象,能够全局的使用它。 简单构造方式 一般我们首先想到是使用全局的静态变量,即全局变量、namespace作用域变量、以及在classes内以及在file...
  • C | C++定义全局变量的方法

    万次阅读 2018-09-07 13:54:07
    我们想定义一个全局变量,能够在多个文件中使用,举例说明比如说三个文件main.c hello.c hello.h 想在main.c和hello.c中使用一个名字为a的变量,可能大家会简单地想直接在hello.h里面定义一个变量unsigned int a; ...
  • 今天上午写C++代码,被神马全局变量和静态全局变量困住了,出现了各种“重定义”和“链接”相关的error。到底在哪里声明,在哪里定义,哪里使用extern?傻傻分不清~ 本来我想自己总结一下的,后来看到网上的总结太...
  • C++ 静态全局变量与普通全局变量

    千次阅读 2015-08-07 11:44:28
    一、存储区域: 1、栈:由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区域。通常存储局部变量,函数参数。 2、堆:由new分配的内存块,需要手动释放。...在C中,全局变量区分初始化的和未初始化的
  • 在头文件中声明变量,在cpp文件中使用。 声明时使用extern关键字 告诉编译器去其他文件中寻找 示例代码 test.h #ifndef TEST_H #define TEST_H int global_v; #endif test.cpp #include <iostream> ...
  •  b.extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用  c.被extern "C"修饰的变量和函数是按照C语言方式编译和连接的  ...
  • C++使用全局变量的extern方式

    千次阅读 2018-11-19 14:13:32
    def.h中声明extern int m; def.cpp中int m; 两个文件必须要有 在主程序中添加头文件,include “def.h”后,就可以直接使用m变量
  • 在项目中有时会用到全局变量来搞,比如一个变量在a文件和b文件中都要使用到 extern能满足咱的需求 上代码 第一步(声明):在 a.h 中 #pragma once 下面这样加一句 extern int s; #pragma once extern int s; // 加...
  • C/C++定义全局变量/常量几种方法的…

    万次阅读 多人点赞 2017-11-03 14:23:02
    在讨论全局变量之前我们先要明白几个基本的概念: 1. 编译单元(模块):   在IDE开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(LINK ERROR), 因为它不像编译...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 137,327
精华内容 54,930
关键字:

c++声明全局变量

c++ 订阅