0

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

另外,将变量声明为静态变量和仅声明外部变量有什么区别?

4

2 回答 2

4

不同之处在于函数内部的静态变量仅在函数内部可见,而外部的静态变量可以被任何函数从其声明点到翻译单元的末尾看到。

否则,它们的行为相同。

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

于 2010-05-06T03:46:43.017 回答
0

第一个例子:

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 定义。

于 2010-05-06T06:37:31.603 回答