2010-08-07 14 views

Odpowiedz

12

Nie używaj const zmiennych dla to! W języku C zmienna kwalifikowana jest stała w sensie stałej ekspresji, więc nie może być używana podczas inicjowania zmiennej statycznej/globalnej. Ma to poważne praktyczne konsekwencje; Na przykład, następujące nie będzie działać:

static const double powers_of_pi[] = { 1, PI, PI*PI, PI*PI*PI, PI*PI*PI*PI, }; 

Właściwym rozwiązaniem jest #define. Najlepiej jest użyć przyrostka l, aby miał typ long double i zawierał wystarczająco dużo miejsc dziesiętnych, aby wartości były poprawne dla typów long double do 128-bitów. Wtedy możesz ich użyć wszędzie tam, gdzie oczekuje się dowolnego typu zmiennoprzecinkowego; C w razie potrzeby zamieni je w cichy na mniejszą precyzję.

+3

+1: C const to śmieci. Na przykład nie możesz tego zrobić: 'static const double pi = 3.1415926; static const double tau = 2 * pi; 'ponieważ w C const inicjalizatory zawsze muszą być kompilowanymi stałymi czasowymi, których pi nie jest. –

+1

Dzięki za wsparcie wstrzyknięcie pewnego rozsądku w ten temat. Wygląda na to, że wszyscy inni wywodzą się z C++ i myślą, że to, co działa w C++ powinno działać w C ... :-( –

+0

@Luther, nie powinno nazywać ich śmieciami.Mają one ograniczone zastosowanie, ale na pewno nie takie, które ktoś który wywodzi się z tła w C++. 'const' nie powinien nigdy zostać wybrany jako słowo kluczowe dla tego, co stoi,' unmutable' lub coś w tym stylu byłoby znacznie bezpieczniejsze, zarówno dla C, jak i C++. –

10

Żaden z nich, należy użyć wartości stałych do zachowania typu sprawdzanie kompilator:

static const double PI = 3.14159265; 
static const double SPEEDOFLIGHT = 2.99792458e8; 
  • #define jest tylko wymiana tekst i typ nieświadomy.
  • Wyliczenia nie są odpowiednie dla wszystkich typów. Nie jestem pewien, ale myślę, że nawet dla wartości double.

EDYCJA: dzięki aaa. Zapomniałem słowa kluczowego static, szczególnie przydatnego, gdy stałe są zadeklarowane w nagłówkach c. (W C++ statyczne nie jest potrzebne)

+1

prawdopodobnie powinien sprawić, by były statyczne, aby uniknąć błędów linkerów – Anycorn

+0

statyczne const podwójne to wtedy, dzięki chłopaki! –

+5

To jest bardzo zła rada. Na przykład nie będzie można używać wyrażeń obejmujących 'PI' jako inicjalizatorów dla danych statycznych. –

3

Ponieważ enum to stałych całkowitych, chciałbym iść z #define.

Zgadzam się z jdehaan, że globalne obiekty const są jeszcze lepsze.

+2

Uważam, że jest to jedyna odpowiedź na wyraźną wzmiankę o tym, że 'enum' jest tylko dla typów całkowitych, ale nie zgadzam się, że globalne obiekty' const' są lepsze (przynajmniej nie wspominając o ich ograniczeniach). – jamesdlin

1

Zgadzam się z jdehaan, preferuj stałe do bardziej jawnego sprawdzania/konwersji typów.

Poza tym używanie enumu, takiego jak opisany, nie jest celem enum. Te stałe są tylko matematycznie powiązane (jeśli kosmolog hokus-pocus ostatecznie się poprawi). Celem wyliczenia jest połączenie jak wartości, takich jak:

enum color 
{ 
    red = 0xFF0000; 
    yellow = 0xFFFF00; 
    baby_puke_green = 0x9ACD32; 
} 
5

osobiście wolę po prostu zrobić Pi, c = 1 i niech ofertę wszechświat problemu

+2

Albo normalizuj :) –