zoukankan      html  css  js  c++  java
  • C++ static全局变量与全局变量的区别/static全局函数与全局函数的区别

    全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。

    以下举例说明:

    1.创建一个名为StaticGlobal的win32 console c++工程

    2.在工程里面添加文件A.cpp, 复制以下代码到A.cpp

    static int i = 0;
    static void Func()
    {
        cout<<i<<endl;
    }
    
    void FuncA()
    {
        Func();
    }
    
    int iG = 0;
    void FuncG()
    {
    }

    3.在工程里面添加文件B.cpp, 复制以下代码到B.cpp

    static int i = 1;
    static void Func()
    {
        cout<<i<<endl;
    }
    
    void FuncB()
    {
        Func();
    }
    
    int iG = 0;
    void FuncG()
    {
    }

    4.复制以下代码到StaticGlobal.cpp

    void Func();
    void FuncA();
    void FuncB();
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        Func();
        FuncA();
        FuncB();
        return 0;
    }

    5.Build工程,将得到以下Linker errors

    1>B.obj : error LNK2005: "void __cdecl FuncG(void)" (?FuncG@@YAXXZ) already defined in A.obj
    1>B.obj : error LNK2005: "int iG" (?iG@@3HA) already defined in A.obj
    1>StaticGlobal.obj : error LNK2019: unresolved external symbol "void __cdecl Func(void)" (?Func@@YAXXZ) referenced in function _wmain

    第1个error是因为FuncG是一个全局函数,在整个程序中都可见,A.cpp里面已经定义了FuncG,B.cpp里面重复定义引起冲突。

    第2个error是因为iG是一个全局变量,在整个程序中都可见,A.cpp里面已经定义了iG,B.cpp里面重复定义引起冲突。

    第3个error是因为Func是静态全局函数,其只在定义它的文件中有效即A.cpp和B.Cpp,在StaticGlobal.cpp中不可见。

    6.注释掉以上错误代码,build通过运行结果如下:

    0
    1
  • 相关阅读:
    [LeetCode] Best Time to Buy and Sell Stock III
    [LeetCode] Implement strStr()
    [LeetCode] Wildcard Matching
    [LeetCode] Gray Code
    [LeetCode] Divide Two Integers
    [LeetCode] Flatten Binary Tree to Linked List
    [LeetCode] Binary Tree Maximum Path Sum
    [TopCoder][SRM] SRM 562 DIV 2
    推荐博客文章
    检测两点所确定直线上的像素坐标
  • 原文地址:https://www.cnblogs.com/ldlchina/p/3630685.html
Copyright © 2011-2022 走看看