【问题标题】:Static variables and extern in plain C普通 C 中的静态变量和外部变量
【发布时间】:2010-05-06 03:44:40
【问题描述】:

在函数外部声明静态变量和在函数内部声明静态变量有区别吗?

另外,声明一个静态变量和只声明一个外部变量有什么区别?

【问题讨论】:

标签: c static extern


【解决方案1】:

不同的是,函数内部的静态变量只在函数内部可见,而外部的静态变量从声明点到翻译单元结束,任何函数都可以看到。

否则,它们的行为相同。

在没有关键字 static 的函数外部声明变量意味着它在定义它的文件(翻译单元)之外(以及从定义点到翻译单元末尾)可见(可访问) )。如果您将变量声明为extern,则意味着在其他地方有一个定义——可能在同一个翻译单元中,但更有可能在另一个翻译单元中。请注意,可以在函数内部声明 extern 变量,但只能在函数外部定义。

【讨论】:

    【解决方案2】:

    第一个例子:

    class SoTest
    {
    public:
        SoTest(const char *name)
        {
            printf("C'tor called of %s\t(%#x) object\n",name,this);
        }
        static SoTest ClassStaticObj;
    };
    
    static SoTest CStaticObj("CStaticObj");
    SoTest SoTest::ClassStaticObj("ClassStaticObj");
    
    void function()
    {
        for (int i = 0; i < 2;i++)
        {
            static SoTest FunctionStaticObj("FunctionStaticObj");
                SoTest FunctionObj("FunctionObj");
        }
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        printf("enter main\n");
        function();
        function();
        getchar();;
        return 0;
    }
    

    产生:

        C'tor called of CStaticObj      (0x419168) object
    C'tor called of ClassStaticObj  (0x419169) object
    enter main
    C'tor called of FunctionStaticObj       (0x419160) object
    C'tor called of FunctionObj     (0x12fe77) object
    C'tor called of FunctionObj     (0x12fe77) object
    C'tor called of FunctionObj     (0x12fe77) object
    C'tor called of FunctionObj     (0x12fe77) object
    

    现在你的问题

    两者有区别吗 在外部声明一个静态变量 一个函数并声明一个静态的 函数内部的变量?

    这些是完全不同的问题 函数外的静态变量/函数在编译单元外不可见。

    函数内部的静态变量在全局数据中分配,并且在第一次出现时仅初始化一次(请参阅 FunctionStaticObj 在 main 之后初始化,与其他对象相矛盾。

    另外,两者有什么区别 将变量声明为静态和 只是声明一个外部变量?

    静态意味着在编译单元之外不可见。

    extern 的意思是“这里没有定义它,虽然在不同的编译单元和链接器会管理它”,所以你可以根据需要进行任意数量的 extern 声明,但只有一个非 extern 定义。

    【讨论】:

      猜你喜欢
      • 2011-03-10
      • 1970-01-01
      • 2012-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      相关资源
      最近更新 更多