2012-03-26 15 views
6

miałem ten kod:Dlaczego nie mogę zainicjować zmiennej statycznej z wartością inną niż literalna?

int foo(void){ 
    return 1; 
} 

int main(void){ 
    static const int x = foo(); 

    //do stuff 
    return 0; 
} 

Ale mam błąd o inicjowanie zmienną statyczną o wartości const. Myślałem, że to ma coś wspólnego ze specyfikatorem const, ale tak się nie stało. Skończyło upuszczenie słowa kluczowego const i robi to:

int foo(void){ 
    return 1; 
} 

int main(void){ 
    static int x = 0; 
    if (x == 0) x = foo(); 

    //do stuff 
    return 0; 
} 

Teraz, dlaczego nie można kompilator tylko opóźnić inicjalizacji zmiennej static int x dopóki nie jest używany, a co ważniejsze, dlaczego nie można po prostu umieścić go w sekcja do odczytu i zapisu, i po prostu wymusić, że nie jest ona zapisana podczas kompilacji? Chciałbym użyć słowa kluczowego const i static dla poprawy semantyki w moim kodzie, ale nie bardzo zależy mi na tym, jak kompilator sobie z tym poradzi, niech to zadziała.

Czy moje rozumienie standardu C jest nieprawidłowe? Czy mój kompilator może ssać? To jest MSVC 9.0.

+1

Co to jest zmienna statyczna w dobru głównym? – tchap

+0

"x" wygląda jak zmienna lokalna w kontekście twojego przykładu. Dlaczego chcesz, żeby to było statyczne? –

+0

@ValAkkapeddi: Często ze względu na to, że nie potrzebujesz/chcesz reinicjalizować go dla każdego połączenia z tą funkcją. –

Odpowiedz

8

C wymaga tego.

Z C Standard:

(C99, 6.7.8p4) „Wszystkie wyrażenia do inicjowania dla obiektu, który ma statyczny czas przechowywania powinna być stała lub wyrażenia literały ciągów znaków.”

Pamiętaj, że kwalifikator const nie oznacza wartości stałej, ale raczej tylko do odczytu. const obiekt nie jest stała w C.

Powodem statyczny obiekt nie może być inicjowane przez nie wartości stałych jest związana z faktem, że inicjalizacja statycznego obiektu odbywa „przed program startowy” (C99, 6.2.4p3).

+0

Proszę wyjaśnić, jaka jest różnica między obiektem const a stałą w C. Stała w C jest wartością dosłowną? – Spidey

+0

Definicja stałej ekspresji w C jest bardzo ograniczona. Jest zdefiniowany w C99 w 6.6 Wyrażenia stałe (wersja html pod adresem http://port70.net/~nsz/c/c99/n1256.html#6.6) –

+0

@Spidey stała jest zasadniczo dosłownym dosłownym, patrz C99, 6.4.4 dla definicji. Stała jest stałym wyrażeniem. Obiekt 'const' nie jest ani stałym, ani stałym wyrażeniem. – ouah

1

Wartość inicjalizacji musi być określona podczas kompilacji lub czasu połączenia. C nie ma pojęcia konstruktorów, które mogłyby zostać uruchomione podczas uruchamiania programu.

1

To ograniczenie wynika z C Standard w sekcji 6.7.8/4, więc to nie tylko kompilator:

Wszystkie wyrażenia do inicjowania dla obiektu, który ma statyczny czas przechowywania powinna być stała wyrażeń lub łańcuch literały.

Powodem tego jest to, że w przeciwieństwie do standardowych C++ sdoes C nie wymagają środowiska wykonawcze, aby zapewnić punkt wejścia inicjalizacji wstępnego uruchomienia (przy pewnością nie zakazujące to, sposób i czas inicjacji statycznej (5,1 .2) jest nieokreślony).

Powiązane problemy