静态变量和extern在普通C中

时间:2010-05-06 03:44:40

标签: c static extern

在函数外声明静态变量和在函数内声明静态变量之间是否存在差异?

另外,将变量声明为静态和声明外部变量之间的区别是什么?

2 个答案:

答案 0 :(得分:4)

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

否则,它们的行为相同。

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

答案 1 :(得分: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意味着“它没有在这里定义,尽管在不同的编译单元和链接器中将对其进行管理”,因此您可以根据需要制作尽可能多的外部声明,但只能使用一个非外部定义。