2016-12-14 3 views
-3

я пишу программу на С ++ и часть его кода, как показано нижеЧто это означает при объявлении объекта со статическим ключевым словом?

#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. «g ++» для программы на C++. – Stargateur

+0

локальная статическая переменная имеет статическую продолжительность хранения и не инициализируется до тех пор, пока она не будет достигнута с помощью управления – cshu

ответ

2

Что происходит в первый раз, когда выполнение достигает static A a;. Создается линия A. Это происходит после puts("In");, поэтому выход находится в правильном порядке.

До сих пор все то же, что и с нестатической переменной. В вашем примере вы все еще можете видеть, что переменная является статической, поскольку Out печатается до Destroy (время жизни статической переменной = время жизни программы). Но одно другое свойство статической переменной не отображается в вашем примере. Попробуйте следующие основные:

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

Выход:

In 
Create 
In 
Out 
Destroy 

Здесь можно увидеть, что «Создать» был напечатан только один раз. Это то, что делает статическая переменная - она ​​инициализируется только один раз, когда выполнение попадает в объявление впервые.

Надеюсь, что это поможет