精华内容
下载资源
问答
  • 全局变量:   局部变量和全局变量的区别在于局部变量只能被所在的脚本访问,而全局变量能被所有的脚本访问.   变量名前加$符号就可以声明全局变量了.

    全局变量:

     

    局部变量和全局变量的区别在于局部变量只能被所在的脚本访问,而全局变量能被所有的脚本访问.

     

    在变量名前加$符号就可以声明全局变量了.

    展开全文
  • 全局变量与强符号和弱符号

    千次阅读 2016-10-18 15:29:06
    全局变量与强符号和弱符号

    程序编译的链接阶段中,将函数和变量统称为符号,函数名或者变量名称为符号名。

    已初始化的(初始化值不为0)全局变量在连接中为强符号,未初始化或者初始化为0的全局变量为弱符号。在多个源文件中,可以允许声明多个同名的全局变量,但只能有一个初始化,即只允许(同时)存在一个强符号。

    例如;Test1.c中:

    double g_num = 10;

    int test()

    {

           printf("test1.c:sizeof(g_num)=%d \n value of g_num = %f\n",sizeof(g_num),g_num);

    }

    Main.c

    int g_num;

    int main(void)

    {

           printf("main.c:sizeof(g_num) =%d \n value of g_num = %d\n",sizeof(g_num),g_num);

           test();

    }

    编译: my@ubuntu:~/$gcc haier_main.c test1.c -o testout

    /usr/bin/ld: Warning: size of symbol`g_num' changed from 4 in /tmp/ccFWHHgz.o to 8 in /tmp/ccqvBCSU.o

     my@ubuntu:~/ $ ./testout

    main.c: sizeof(g_num) =4

     value of g_num = 0

    test1.c:sizeof(g_num)= 8

     value of g_num = 10.000000

    注意上面的警告;是因为在连接时,保存在符号表中的g_numdouble类型的,main,c中声明的g_num可以看做是对test1.c中的g_num 赋值0.,查看符号表如下:

     my@ubuntu:~/ $ readelf -s testout

    …….

    __libc_start_main@@GLIBC_

       64: 08048660    97 FUNC    GLOBAL DEFAULT   13 __libc_csu_init

       65: 0804a028     0 NOTYPE  GLOBAL DEFAULT  ABS _end

       66: 08048360     0 FUNC    GLOBAL DEFAULT   13 _start

       67: 08048728     4 OBJECT GLOBAL DEFAULT   15 _fp_hw

       68: 0804a020     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start

       69: 08048502   296 FUNC    GLOBAL DEFAULT   13 main

       70: 00000000     0 NOTYPE  WEAK  DEFAULT  UND _Jv_RegisterClasses

       71:0804a018    8 OBJECT  GLOBAL DEFAULT   24 g_num

       72: 080482d4     0 FUNC    GLOBAL DEFAULT   11 _init

    73:0804862c   39 FUNC    GLOBAL DEFAULT   13 test

     

    另外,如果将test1.c中修改为:

    int g_num = 10;

    int test()

    {

           printf("test1.c:sizeof(g_num)=%d \n value of g_num = %d\n",sizeof(g_num),g_num);

    }

    Main,c 中修改为:double g_num;

    编译后,则打印结果为:

     my@ubuntu:~/ $ gcc  haier_main.c test1.c -o testout

    gcc: error: haier_main.c: No such fileor directory

     my@ubuntu:~/ $ gcc  haier_main.c test1.c -o testout

    /usr/bin/ld: Warning: alignment 4 ofsymbol `g_num' in /tmp/cc6qqr8P.o is smaller than 8 in /tmp/ccWo2XAC.o

    /usr/bin/ld: Warning: size of symbol`g_num' changed from 8 in /tmp/ccWo2XAC.o to 4 in /tmp/cc6qqr8P.o

     my@ubuntu:~/ $ ./testout

    main.c: sizeof(g_num) =8

     value of g_num = 0.000000

    test1.c:sizeof(g_num)= 4

     value of g_num = 10

     my@ubuntu:~/ $

    使用readelf –stestout查看结果如下:

     69: 08048502   296 FUNC   GLOBAL DEFAULT   13 main

       70: 00000000     0 NOTYPE  WEAK  DEFAULT  UND _Jv_RegisterClasses

       71: 0804a018     4 OBJECT  GLOBAL DEFAULT   24 g_num

       72: 080482d4     0 FUNC    GLOBAL DEFAULT   11 _init

    73:0804862c   39 FUNC    GLOBAL DEFAULT   13 test

     

    以上可以看出,连接器无法判断各个符号的类型是否一致当存在多个同名的符号时,连接后输出文件中该变量所占的空间的大小以输入文件(符号)中最大的那个为准,这也是连接中的common类型的连接规则。但是当多个符号中有一个是强符号时,那么最终输出结果中的符号所占的空间与强符号相同。

    再者如果在,main.c中定义了未初始化的全局变量,在可执行文件中可以发现已经为这些变量分配了虚拟空间的地址:

    double g_num;

    int g_flag;

    int g_flag1;

    int main(void)…

     my@ubuntu:~/ $ readelf -s testout

    Symbol table'.dynsym' contains 6 entries:

       Num:   Value  Size Type    Bind  Vis      Ndx Name

        ….

        54: 0804a01c     0 NOTYPE GLOBAL DEFAULT  ABS _edata

        55: 0804a024     4 OBJECT GLOBAL DEFAULT   25 g_flag

        ……

        72: 0804a018     4 OBJECT GLOBAL DEFAULT   24 g_num

        73: 0804a028     4 OBJECT GLOBAL DEFAULT   25 g_flag1

        74: 080482d4     0 FUNC   GLOBAL DEFAULT   11 _init

        75: 0804862c    39 FUNC   GLOBAL DEFAULT   13 test

    注意其中第二列表示的在可执行文件加载时的虚拟空间的地址(即程序在进程所使用的虚拟地址),在Linuxelf可执行文件默认从地址0x08048000开始分配。

    未初始化的全局变量或静态变量在编译的时候不会分配内存,可能在加载的时候会为之分配。但是,对于已经初始化的全局或静态变量在编译的时候就需要为之分配内存保存那些初始化的值,这时它们一般会被编译进data段(在linux下),这时这些变量所占用的空间也就被分配了,在加载的时候,data段会被整个加载入内存,因此其对应的空间也被加载到了内存,而不是在堆中再进行分配,堆中都是用mallocnew之类的动态申请的,而不是编译时候就占用的。

    展开全文
  • Python全局变量

    千次阅读 2020-07-11 08:54:52
    In this tutorial, We will look into Python Global Variables. We will learn how to define a global variable and then how to access them in a ... 我们将学习如何定义全局变量,然后如何函数访问它们。...

    In this tutorial, We will look into Python Global Variables. We will learn how to define a global variable and then how to access them in a function.

    在本教程中,我们将研究Python全局变量。 我们将学习如何定义全局变量,然后如何在函数中访问它们。

    Python中的全局变量 (Global Variables in Python)

    Global Variables are defined outside a function. We can access a global variable in all parts of the Python program.

    全局变量在函数外部定义。 我们可以在Python程序的所有部分中访问全局变量。

    Python全局变量示例 (Python Global Variables Example)

    Let’s look at a simple example to declare a global variable. Then we will use this global variable in a function.

    让我们看一个声明全局变量的简单示例。 然后,我们将在函数中使用此全局变量。

    website = "JournalDev.com"
    
    
    def return_website():
        return website
    
    
    print(f'My favorite website is {return_website()}')

    Output:

    输出:

    My favorite website is JournalDev.com

    The variable “website” is defined in the program, outside of a function. So, it becomes a global variable.

    变量“网站”在程序中的函数外部定义。 因此,它成为一个全局变量。

    使用全局关键字访问全局变量 (Using global keyword to access global variable)

    If there is a variable defined inside a function with the same name, then we have to use global keyword to access the global variable. Otherwise, the local variable value will be used.

    如果在函数内部定义了一个具有相同名称的变量,那么我们必须使用global关键字来访问全局变量。 否则,将使用局部变量值。

    Let’s look at a quick example to use the global keyword to access global variables.

    让我们看一个使用global关键字访问全局变量的简单示例。

    website = "JournalDev.com"
    
    
    def print_website():
        global website
        print(f'My favorite website is {website}')
    
        website = 'Wikipedia.com'
        print(f'My favorite website is {website}')
    
    
    print_website()

    Output:

    输出:

    My favorite website is JournalDev.com
    My favorite website is Wikipedia.com

    If we don’t use the global keyword, the program will throw error message “UnboundLocalError: local variable referenced before assignment”.

    如果我们不使用global关键字,则程序将抛出错误消息“ UnboundLocalError:分配前引用的本地变量”。

    The best practice is to avoid using the same name as the global variable and stay away from the name conflicts.

    最佳做法是避免使用与全局变量相同的名称,并避免名称冲突。

    Python globals()函数快速入门 (Quick word on Python globals() function)

    Python globals() function return a dictionary representing the current global symbol table. This dictionary contains the global variables name and its values. We can use this function to get quick information on all the global variables.

    Python globals()函数返回一个表示当前全局符号表的字典 。 该词典包含全局变量名称及其值。 我们可以使用此功能来获取有关所有全局变量的快速信息。

    Python program maintains program information in symbol tables.

    Python程序在符号表中维护程序信息。

    There are two types of symbol tables:

    符号表有两种类型:

    1. Local Symbol Table – stores information related to the local scope of the program.

      本地符号表 –存储与程序的本地范围有关的信息。
    2. Global Symbol Table – stores information related to global scope of the program.

      全局符号表 –存储与程序的全局范围有关的信息。

    Python symbol table contains details about variable names, methods, classes, etc.

    Python符号表包含有关变量名称,方法, 等的详细信息。

    Python globals() function doesn’t accept any arguments.

    Python globals()函数不接受任何参数。

    print(globals())

    Output:

    输出:

    {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10a99b358>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/Users/pankaj/Documents/github/journaldev/Python-3/basic_examples/python_globals_example.py', '__cached__': None}

    It also prints the python script from where this function is called.

    它还会在调用此函数的位置打印python脚本。

    Let’s see the output if the same function is called from the Python interpreter.

    让我们看看是否从Python解释器调用了相同的函数的输出。

    $ python3.7
    Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 26 2018, 23:26:24) 
    [Clang 6.0 (clang-600.0.57)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> print(globals())
    {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>}
    >>>

    This time there is no __file__ attribute in the output.

    这次输出中没有__file__属性。

    globals()字典中的全局变量 (Global Variables in globals() dictionary)

    As we mentioned earlier that the global symbol table contains information about the global variables.

    如前所述,全局符号表包含有关全局变量的信息。

    Let’s see this with a simple example.

    让我们用一个简单的例子来看一下。

    name = 'Pankaj'
    
    print(globals())

    Output:

    输出:

    {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10a99b358>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/Users/pankaj/Documents/github/journaldev/Python-3/basic_examples/python_globals_example.py', '__cached__': None, 'name': 'Pankaj'}

    The global symbol dictionary contains the ‘name’ variable too.

    全局符号字典也包含“名称”变量。

    One of the features of globals() is that we can modify the variables in the global dictionary. Since it’s a dictionary, we can get the value of a specific key too.

    globals()的功能之一是我们可以修改全局字典中的变量。 由于它是字典,因此我们也可以获取特定键的值。

    globals()['name'] = 'David'
    
    print(globals()['name'])

    Output: David

    输出: David

    Let’s see if globals() contains local scope variables or not. For this, let’s define a function and some variables inside it.

    让我们看看globals()是否包含局部作用域变量。 为此,让我们定义一个函数和其中的一些变量。

    def fx():
        local = ''
        global gl
        gl = 'Global'
    
    
    fx()  # calling fx() to set the variables
    print(globals())
    
    print(globals()['gl'])

    Output:

    输出:

    {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10a99b358>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/Users/pankaj/Documents/github/journaldev/Python-3/basic_examples/python_globals_example.py', '__cached__': None, 'name': 'David', 'fx': <function fx at 0x10a9331e0>, 'gl': 'Global'}
    
    Global

    The ‘gl’ variable is part of the global dictionary because its scope is global. Whereas, ‘local’ variable is not part of the global dictionary because of having local scope.

    'gl'变量是全局词典的一部分,因为它的范围是全局的。 而“局部”变量由于具有局部范围,因此不属于全局词典。

    结论 (Conclusion)

    Python global variables are very easy to define and use. The globals() function returns the global variables and it can be used in debugging the code. We can use it to identify the global scope variables and functions available to the program. We can also modify the global variable data, but that is not advisable and mostly not required in normal programs.

    Python全局变量非常易于定义和使用。 globals()函数返回全局变量,可用于调试代码。 我们可以使用它来识别程序可用的全局范围变量和函数。 我们还可以修改全局变量数据,但这是不可取的,并且在正常程序中通常不是必需的。

    GitHub Repository.GitHub存储库中检出完整的python脚本和更多Python示例。

    Reference: Official Documentation

    参考: 官方文档

    翻译自: https://www.journaldev.com/22870/global-variables-python

    展开全文
  • 提示错误信息:count:不明确的符号,,count明明定义为全局变量,怎么成为不明确的符号了呢??百思不得其解 查阅资料找到了答案:命名空间std有一个count函数 编译器不知道调用的是:std::count(),还是用户...

    今天用vs2013编写程序时遇到以下这么一个bug


    提示错误信息:count:不明确的符号,,count明明定义为全局变量,怎么成为不明确的符号了呢??百思不得其解

    查阅资料找到了答案:命名空间std有一个count函数


    编译器不知道调用的是:std::count(),还是用户定义的全局变量count,故报错

    解决办法,在count前面加上作用域标识符:::count即可

    如果同时要用到std中的count函数,加上命名空间和作用标识符即可:std::count()


    原文链接:【debug】vs2013中定义的全局变量count在使用时提示:“不明确的符号”

    展开全文
  • 关于全局变量和全局函数的声明

    千次阅读 2013-12-25 14:28:04
    申明全局变量,全局函数一定要cpp申明 其他类引用该全局变量就include该cpp的h文件 然后extern一下就好了 否则容易出现该重复定义错误 这个"容易"是如何解释的呢? 例如A.h如果申明了全局变量...
  • 提示错误信息:count:不明确的符号,,count明明定义为全局变量,怎么成为不明确的符号了呢??百思不得其解 查阅资料找到了答案:命名空间std有一个count函数 编译器不知道调用的是:std::count(),还是用户...
  • extern 声明全局变量,多文件使用

    千次阅读 2015-01-21 20:24:18
    a.h#ifndef A_H_ #define A_H_ extern int value; #endif 声明了value变量 ...code1.cpp中声明并定义、赋值了变量value。不可以函数去定义value,会报错。猜测是因为函数的局部变量会释放空间 c
  • 全局变量能否放在头文件定义

    千次阅读 2018-05-29 19:42:04
    今天遇到一个坑,VS上进行多文件的编译运行的时候,头文件定义了全局变量a,该头文件被类的实现CPP和主函数所在的CPP包含且声明extern int a。但是链接的时候报多重定义的错误。网上看了下,这篇文章给出了...
  •  C语言一般将全局变量intA的定义和初始化放在fileName .c或者其它 xx.c文件,同时与之对应的fileName.h文件进行 extern int A声明。当一个全局变量int A仅fileName.c文件定义而未相对应的头文件...
  • 下面有几种网上的理解,我整理一下:一: 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员...
  • 全局变量

    2010-10-28 13:37:00
    跨文件用全局变量的话,必须用之前用extern声明 比如,你1.CPP中一个变量int a; 你想2.CPP引用它的话,2.CPP,先用extern int a; 然后就可以用了. 好像还要#include"core.c" _________________________...
  • 我们先来看内存的几大区: 内存到底分几个区? 下面有几种网上的理解,我整理一下: 一:  1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构的...
  • C++如何类的成员函数表示同名的全局变量?可以显式地通过作用域运算符::实现。 作用域运算符::的用法有2种: 第1种,类名+类的成员变量/成员函数/类内自定义类型,代表的类作用域内定义的变量/函数/类型; 第2种...
  • 今天被问到了一个问题:如何让请求的类延迟释放如果要延迟释放或者程序整个生命周期都存在可以考虑两种方式,一是定义一个静态变量,二是用单例。用单例本质上用的是静态变量。单例的写法如下:+ (instancetype)...
  • 很多小伙伴Qt编程时,不会使用全局变量,其实基本有两种方式来定义使用全局变量,第一种是根据c/c++的extern来进行多文件的使用,第二种方法就是把全局变量放在类,当做类静态变量来使用,一般来说,第一种方式...
  • 看书时发现了这几个概念有些混乱,和同学们讨论也觉得这个地方没搞懂,包括网上的一些对于这方面的介绍,让自己更糊涂了。花了几天时间,稍微弄懂了些。 之所以有些混乱,我觉得是基本概念没有搞清楚,我查阅了...
  • 为了完成这个技巧,我们需要以下这个类,把它写都文件即可 template class GlobalVar{ public: static T var; }; template T GlobalVar::var;这样,我们便拥有了任意变量上任意数量的变量,而且,用的时候...
  • 外部变量与全局变量

    千次阅读 2017-10-14 14:18:25
     一个头文件a.h定义一些变量x,其他.c文件(b.c,c.c)要用到,两个*.c包含a.h以后,  编译时总是提示error:multiple definition of x。 解决思路:  当时本想采用extern变量的方法,但考虑到会使用...
  • 题目: ...如果一C文件全局变量定义:int g; 那么同一系统的另一C文件怎么定义不会有问题(多项选择)? A.int g; B.extern int g; C.int g = 0; D.u32 g; 答案: A,B,C  对于C/C+
  • CUDA如何设备上分配全局变量

    千次阅读 2013-11-19 09:57:21
    假设定义了全局变量 __device__ int *a;  我需要一个数组,动态分配,那么直接调用cudaMalloc来为a分配内存的话,是不行的。 具体做法如下 [cpp] view plaincopy ...
  • 内存分配: 对于局部变量而言,内存分配的顺序和代码的顺序是一样的,但全局变量...2)对于没有初始化的全局变量,因为不知道是定义还是声明,所以要扫描完所有代码之后才能决定,这个时候编译器会读符号表,然后看哪
  • 看到一篇介绍C语言强符号与弱符号的文章非常好,转载过来加深印象。 ... ============================================================================== 一、概述 ...C语言,函数和初始化的全局变量
  • MFC 单文档的全局变量

    千次阅读 2016-04-10 13:15:59
    单文档每个view类有自己的局部变量,所以应用程序定义全局变量这些View类啊,Doc类啊的外面。 待解决问题:希望对每处理一个文件,全局变量+1(如图1所示,期望处理后结果为5,CVMFC1不算) ...
  • C++全局变量工程用法

    千次阅读 2014-12-13 16:48:18
    原来一直作为一个只会敲C++的弱ACMer, ..."gv.h"文件中用extern声明全局变量,如 extern int gv; “gv.cpp”文件定义全局变量,如 int gv; 其他文件使用、调用全局变量(包含"gv.h"文件),如 gv=1
  • python学习之全局变量与局部变量

    千次阅读 2017-08-28 19:24:36
    python全局变量global python局部变量local UnboundLocalError: local variable 'name' referenced before assignment python闭包 nonlocal locals() 和 globals()
  • C语言跨文件的全局变量

    千次阅读 2013-01-12 18:00:35
    声明:突然看到这篇文章,发现了c语言使用全局变量的错误,特转之。 首先看一段代码(https://gist.github.com/3760736) func.c 123456 int buf = 0;   void func() { buf = ...
  • Python入门-全局变量、main函数

    千次阅读 2014-04-02 11:05:02
    函数外面声明的变量称为全局变量,程序的任何函数都可以读取它。但是,函数全局变量重复赋值需要特小心。如以下代码: #global.py name='Tony' def say_hello(): print('Hello '+name+'!') def change_...
  • 局部变量和全局变量试题

    千次阅读 2011-03-28 08:47:00
    、局部变量能否和全局变量重名?答:能,局部会屏蔽全局。...答:extern可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个头文件中声明的全局变理,假定你将那个变写错了,那么
  • 另外一点,可以不同的c文件中声明同名的全局变量,前提是其中只能有一个c文件对此变量赋值,此时链接不会出错。 extern和static不能同时修饰同一变量。 链接规范,每个c/c++的定义都有链接规范(linkage)的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 109,536
精华内容 43,814
关键字:

如何在符号表中声明全局变量