精华内容
下载资源
问答
  • JS 全局变量的作用域

    2020-03-16 22:45:45
      JS中的当全局变量与局部变量重名时,全局变量的作用域不包括局部变量的作用域;   例如图中,全局变量a的作用域,不包括 f1 函数作用域,因为 f1 函数内声明了一个同名的局部变量 a: ...

      JS中的当全局变量与局部变量重名时,全局变量的作用域不包括局部变量的作用域;

      例如图中,全局变量a的作用域,不包括 f1 函数作用域,因为 f1 函数内声明了一个同名的局部变量 a:

    在这里插入图片描述

    展开全文
  • 静态变量的作用域是当前源文件,全局变量的作用域是整个可执行程序。 值得注意的是:如果在头文件定义全局变量,在预编译期间#include的头文件会被拷贝进源文件中,编译器是不知道头文件的。虽然全局变量是全局作用...

    全局变量和静态变量的存储方式是一样的,只是作用域不同。如果它们未初始化或初始化为0则会存储在BSS段,如果初始化为非0值则会存储在DATA段,见进程的地址空间分配一文。静态变量的作用域是当前源文件,全局变量的作用域是整个可执行程序。 值得注意的是:

    • 如果在头文件定义全局变量,在预编译期间#include的头文件会被拷贝进源文件中,编译器是不知道头文件的。
    • 虽然全局变量是全局作用域,但需要extern关键字来声明以通过编译。因为C++是强类型语言,编译时需要根据变量声明做类型检查。

    全局变量的引用

    C++源文件中引用外部定义的全局变量和引用外部函数是一样的语法,通过extern来声明:

    // file: a.cpp
    #include<iostream>
    extern int a;
    int main() {
        std::cout<<b<<std::endl;
        return 0;
    }
    
    // file: b.cpp
    #include<iostream>
    int a = 2;
    

    然后分别编译这两个文件,链接生成a.out并执行它:

    $ g++ a.cpp b.cpp
    $ ./a.out
    b.cpp
    2
    

    extern只是在当前文件中声明有这样一个外部变量而已,并不指定它来自哪个外部文件。所以即使extern变量名错误当前源文件也能通过编译,但链接会出错。

    头文件中定义

    因为头文件可能会被多次引用,在预编译时被引用的头文件会被直接拷贝到源文件中再进行编译。一个常见的错误便是把变量定义放在头文件中,例如下面的变量int a

    // file: a.cpp
    #include <iostream>
    #include "b.h"
    int main() {
        std::cout<<a<<std::endl;
        return 0;
    }
    
    // file: b.cpp
    #include<iostream>
    #include"b.h"
    void f(){}
    
    // file: b.h
    int a = 2;
    

    头文件b.h中定义了int a,它被a.cppb.cpp同时引入。我们将a.cppb.cpp分别编译是没有问题的,然后链接时会抛出错误:

    duplicate symbol _a in:
        /tmp/ccqpfU5e.o
        /tmp/ccCRi9nO.o
    ld: 1 duplicate symbol for architecture x86_64
    collect2: error: ld returned 1 exit status
    

    两个.o文件中的_a名称发生了冗余,这是变量重定义错误。

    头文件中声明

    因为声明操作是幂等的,而多次定义会引发重定义错误。所以 头文件中不应包含任何形式的定义,只应该包含声明,正确的办法是变量定义总是在源文件中进行,而声明放在头文件中:

    #include <iostream>
    #include "b.h"
    int main() {
        std::cout<<a<<std::endl;
        return 0;
    }
    
    // file: b.cpp
    #include<iostream>
    #include"b.h"
    int a = 2;
    
    // file: b.h
    extern a;
    

    然后编译链接执行都会通过,输出2

    $ g++ a.cpp b.cpp
    $ ./a.out
    2
    

    编译器看到g++ a.cpp b.cpp时会自动去查找b.h并进行预编译操作,因此不需要显式指定b.h

    静态全局变量

    非静态全局变量是外部可链接的(external linkage),目标文件中会为它生产一个名称供链接器使用;而静态全局变量是内部可链接的(internal linkage),目标文件中没有为链接器提供名称。因此无法链接到其他文件中,因此静态变量的作用域在当前源文件(目标文件)。虽然静态和非静态全局变量可能存储在同一内存块,但它们的作用域是不同的。 来看例子:

    // file: a.cpp
    #include <iostream>
    extern int a;
    int main() {
        std::cout<<a<<std::endl;
        return 0;
    }
    
    // file: b.cpp
    static int a = 2;
    

    然后g++ a.cpp b.cpp时发生链接错:

    Undefined symbols for architecture x86_64:
      "_a", referenced from:
          _main in ccPLYjyx.o
    ld: symbol(s) not found for architecture x86_64
    collect2: error: ld returned 1 exit status
    

    链接时未找到名称_a,因此静态变量在编译得到的目标文件中没有为链接器提供名称。所以其他目标文件无法访问该变量,静态全局变量的作用域是当前源文件(或目标文件)。

    全局变量初始化

    全局变量比较特殊,初始化有两种方式:

    • 静态初始化(static initialization):对于定义时给出初始化参数的全局变量,其初始化在程序加载时完成。根据是否被初始化、是否被初始化为0会把它存储在BSS或者DATA段中,参见进程的地址空间分配
    • 动态初始化(dynamic initialization):定义变量时可以不给出初始化参数,而是在某个函数中进行全局变量初始化。

    对于静态初始化,看这个例子:

    class C{
    public:
        C(){ std::cout<<"init "; }
    };
    C c;
    int main() { std::cout<<"main"; return 0; }
    

    main()进入之前,程序加载时动态初始化,程序输出为一行init main

    关于全局变量的初始化顺序,同一源文件中的全局变量初始化顺序按照定义顺序,不同源文件(编译单元)的全局变量初始化顺序并未规定。因此软件设计时不要依赖于其他编译单元的静态变量,可以通过单例模式来避免这一点。


    原文地址https://harttle.land/2015/09/30/cpp-static-and-global.html

    展开全文
  • 局部变量和全局变量的作用域

    千次阅读 2019-06-30 19:10:34
    局部变量:在函数内部定义的变量,只在函数内部起作用,函数执行结束,变量会自动删除 即在一个函数内部定义的变量,只在本函数范围内有效 ...由于同一文件中的所有函数都能引用全局变量的值 因...

    局部变量:在函数内部定义的变量,只在函数内部起作用,函数执行结束,变量会自动删除
    即在一个函数内部定义的变量,只在本函数范围内有效
    全局变量:“在函数外定义的变量”,即从定义变量的位置到本源文件结束都有效
    即可以被程序所有对象或者函数引用  
    当有外部变量时,main函数中的同名变量就是全局变量。如果没有外部变量,main函数里的变量依然是局部变量
    或者也可以直接在函数内部声明变量为全局变量

    目的:增加函数间数据联系的渠道。由于同一文件中的所有函数都能引用全局变量的值
    因此如果在一个函数中改变了全局变量的值,就能影响到其他函数中全局变量的值,相当于各个函数之间有直接的传递渠道

    a = 1
    print('out: ',id(a))查看变量的id
    def fun():
        global a
        a = 5
        print('in: ',id(a))
    fun()
    print(a)
    print(id(a))
    id是查看变量在内存中存放区域的编号
    

    在这里插入图片描述
    在这里插入图片描述
    此时函数内部定义的a是全局变量,所有的输出均为全局变量的信息
    在这里插入图片描述
    在这里插入图片描述
    此时函数外面的a是全局变量,所有的输出是全局变量的信息,局部变量只在函数内部起作用

    展开全文
  • 具有文件作用域的变量称为全局变量,具有函数或者块作用域的变量称为局部变量 全部变量的初始值为0 当全局变量和局部变量名相同时,全局变量被屏蔽 为了访问局部变量,可以用域运算符“::”
    c++ 标示符作用域
    
    具有文件作用域的变量称为全局变量,具有函数或者块作用域的变量称为局部变量

    全部变量的初始值为0

    当全局变量和局部变量名相同时,全局变量被屏蔽

    为了访问局部变量,可以用域运算符“::”
    展开全文
  • 变量的作用域 变量的作用域是指变量的作用范围,即变量再程序中可以被访问的区域。 c语言中,每个变量都有一个有效的作用域。比如再函数内部定义的变量,不能再其他函数中引用 局部变量 指再函数体定义的变量和函数...
  • 局部变量:在某个函数内部定义,...下面用案例具体来说明它的作用域: (1): def Demo1(): num = 1 print(num) Demo1() print(num) &quot;&quot;&quot; 因为num是局部作用,所以在函...
  • 1.之前我理解类是为了节省时间演化来,因此里面静态属性应该和模块中的全局变量作用范围类似,那类中静态属性应该在整个类中都能访问。但实际为代码段所示。 2. ``` 2.1 全局变量能被内部定义函数所...
  • 本文主要介绍C++中的局部变量、全局变量、以及动态内存管理的变量。本文不涉及静态变量static,所以描述的观点不包括static变量。...这部分变量存储在 全局/静态存储区,这部分变量的作用域是从...
  • 1.c++中static int a,其中a的作用域是local的,即当前文档。 2.c++中const int a=10;其中a的作用域是local的,即当前文档,extern const int a=10,的作用域全局的。
  • <!DOCTYPE html> <title>Webville Tunes var avatar = "genertic"; var skill = 1.0; var pointsPerLevel = 1000; var userPoints = 2008;...在函数外全局变量,在函数内是局部变量
  • // 方法1 static int n; // 方法二 namespace { int n; }
  • {}以内区域称为局部作用域,{}以外称为全局作用域。这个区分在开始时候帮助我们理解,尤其对函数来说。 之后我们会有更加清楚区分 局部变量和全局变量 局部变量 凡是大括号{}以内变量,都是局部变量。附:...
  • 1调用函数时,Python 会优先在局部作用域内寻找变量,找不到再去外层的全局变量寻找,如果都找不到则报NameError错误 # 这里 rule 在函数外是全局变量 rule = '965 工作制' def busy_company(): # 这里 ...
  • 全局变量的作用域是整个程序,局部变量的作用域是定义变量的函数内部,离开函数局部变量失效。 2.一个局部函数不能使用另一个局部函数中定义的变量。 http://c.biancheng.net/cpp/html/62.html ...
  • ** 1,全局变量 ** 1,在函数和类定义之外声明的变量。 作用域为定义的模块,从定义位置开始,知道模块结束。...全局变量的作用域测试: a = 100 #全局变量 def f1(): global a # 在函数内改变全局变...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,364
精华内容 8,945
关键字:

全局变量的作用域