2013-04-19 10 views
5

Kiedy są przeliczane wartości wyliczeniowe? Innymi słowy, czy poniższy kod jest zgodny ze standardem?Czy wartości wyliczeniowe są rozwiązywane w czasie preprocesingu lub w czasie kompilacji?

enum{ 
    A, 
    B, 
    MAX 
} 

#if MAX > 42 
# error "Woah! MAX is a lot!" 
#endif 
+1

wyliczenia nie mają nic wspólnego z preprocesorem. –

+0

@ Michael Burr, Powyższy kod faktycznie kompiluje się bez ostrzeżeń w MSVC6.0. To jest C89 - jak. – Vorac

+2

Myślę, że nie kompiluje się z podwójnym "u" w enum! –

Odpowiedz

6

Preprocesor nie ma nic wspólnego z wyliczeniami. Ale twój przykład kompiluje się bezbłędnie, więc co się dzieje z dyrektywą #if MAX > 42?

Gdy preprocesor jest obsługa warunkową dyrektywy, wszelkie identyfikatory, które nie są zdefiniowane jako makra są traktowane jako 0. Więc zakładając, że MAX nie jest zdefiniowana w innym miejscu jako makro, Twój fragment kodu odpowiada:

enum{ 
    A, 
    B, 
    MAX 
} 

#if 0 > 42 
# error "Woah! MAX is a lot!" 
#endif 

od C99 6.10.1/3 „warunkowa włączenie”:

... Po każdej wymianie ze względu na makr i określonej operatora jednoargumentowy przeprowadzono wszystkie pozostałe identyfikatory zastąpiony przez numer pp 0, a następnie każdy token przetwarzania wstępnego to przekształcony na token. ...

To samo sformułowanie ma standard C89/C90.

+0

Taki głupi błąd z mojej strony! Dziękuję wszystkim za wyjaśnienie tego. – Vorac

Powiązane problemy