我正在编写一个C ++程序,其代码部分如下所示
#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;
}
我认为 static 关键字会使它像一个全局变量,这个程序的输出应该是
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 ++编译它,它已经过时了
In
Create
Out
Destroy
那么,为什么会发生这种情况呢?使用 static 关键字声明对象时意味着什么?
答案 0 :(得分:2)
这里发生的事情是第一次创建执行到static A a;
行A
。这发生在puts("In");
之后,因此输出的顺序正确。
到目前为止,所有内容都与非静态变量相同。在您的示例中,您仍然可以看到变量是静态的,因为Out
在Destroy
之前打印(静态变量的生命周期=程序生命周期)。但是,示例中不显示静态变量的另一个属性。尝试以下主要内容:
int main()
{
Test();
Test();
puts("Out");
return 0;
}
输出结果为:
In
Create
In
Out
Destroy
您可以在此处看到“创建”仅打印一次。这就是静态变量的作用 - 当执行第一次执行到声明时,它只被初始化一次。
希望这有帮助