2016-12-14 47 views
-3

我正在写一个C++程序和代码的一部分是像下面用static关键字声明一个对象是什么意思?

#include <cstdio> 
class A 
{ 
public: 
    A() 
    { 
     puts("Create"); 
    } 
    ~A() 
    { 
     puts("Destroy"); 
    } 
}; 
void Test() 
{ 
    puts("In"); 
    static A a; //declare an object with static keyword. 
} 
int main() 
{ 
    Test(); 
    puts("Out"); 
    return 0; 
} 

我认为静态关键字将使它像一个全局变量,而这个程序的输出应该是

Create 
In 
Out 
Destroy 

但事实是,当我使用GCC编译它,我得到了一些链接错误,

/tmp/cc1JwaFb.o: In function `Test()': 
test.cpp:(.text+0x23): undefined reference to `__cxa_guard_acquire' 
test.cpp:(.text+0x46): undefined reference to `__cxa_guard_release' 
test.cpp:(.text+0x6e): undefined reference to `__cxa_guard_abort' 
/tmp/cc1JwaFb.o:(.eh_frame+0x6b): undefined reference to `__gxx_personality_v0' 
collect2: error: ld returned 1 exit status 

但我可以用G ++,这outputed

In 
Create 
Out 
Destroy 

所以编译它,为什么这会发生?当用静态关键字声明对象时,这意味着什么?

+1

我用C编译器编译C++程序,为什么它不起作用? “GCC”是一个多编译器,“gcc”用于C程序。用于C++程序的“g ++”。 – Stargateur

+0

本地静态变量具有静态存储持续时间,并且在通过控制达到它之前,它不会被初始化 – cshu

回答

2

这里发生的是第一次执行到static A a;A被创建。这发生在puts("In");之后,所以输出的顺序是正确的。

到目前为止,一切都与非静态变量相同。在你的例子中,你仍然可以看到变量是静态的,因为在Destroy(静态变量的生命周期=程序生存期)之前打印了Out。但是你的例子中没有显示静态变量的其他属性。请尝试以下主:

int main() 
{ 
    Test(); 
    Test(); 
    puts("Out"); 
    return 0; 
} 

输出是:

In 
Create 
In 
Out 
Destroy 

你可以在这里看到“创建”被打印一次。这是静态变量的作用 - 当执行程序第一次进入声明时,它只会被初始化一次。

希望这有助于

相关问题