2010-02-23 19 views
10

mam to:Dlaczego nie mogę użyć sizeof() w #if?

#if sizeof(int) 
    #error Can't use sizeof in a #if 
#endif 

otrzymuję ten błąd kompilatora:

missing binary operator before token "(" 

Czemu nie mogę użyć operatora sizeof tutaj?

+2

ma b Zapytany wiele razy. Po prostu szukaj. Oto jedna odpowiedź, na przykład http://stackoverflow.com/questions/1717665/c-throwing-compilation-error-on-size-comparison-in-preprocessor-if – AnT

+0

Myślę, że szukasz LISP lub Scheme :) – leppie

Odpowiedz

12

Ponieważ sizeof() jest obliczany po uruchomieniu preprocesora, więc informacja nie jest dostępna dla #if.

Kompilatory C są logicznie podzielone na dwie fazy, nawet jeśli większość współczesnych kompilatorów ich nie rozdziela. Najpierw źródło jest przetwarzane wstępnie. Wymaga to opracowania i zastąpienia wszystkich preprocesorów warunkowych (#if, #define, zastąpienie zdefiniowanych słów ich zamiennikami). Źródło jest następnie przekazywane, przetwarzane, do samego kompilatora. Preprocesor ma tylko minimalną świadomość struktury C, nie ma wiedzy o typie, więc nie może obsłużyć konstruktów na poziomie kompilatora, takich jak sizeof().

2

Ponieważ można używać tylko stałych literowych w dyrektywie preprocesora. Poza tym sizeof (int) jest zawsze większy od 0, więc uważam, że to #if i tak będzie cały czas prawdziwe.

+0

To był zły przykład z mojej strony. Próbowałem usunąć wszystkie moje specyficzne dla projektu szczegóły i wymyśliłem ten przykład. – Robert

+1

Nie do końca prawda: można wykonywać operacje logiczne i istnieją wywołania funkcji podobne ('defined()'). Niektóre preprocesory pozwalają na załadowanie dodatkowych rzeczy (widziałem ludzi pytających o operatorów logów w preprocesorze, ponieważ użyli ich z wbudowanym kompilatorem). –

0

#if to dyrektywa preprocesora.
sizeof() jest operatorem C i jest obliczany podczas kompilacji.

W czasie pracy preprocesora (gdy obsługiwane jest #if) operatory C nie są wykonywane.

+0

'sizeof' nie jest funkcją biblioteczną, jest operatorem. – avakar

+0

Nie do końca prawda: sizeof() to funkcja językowa, a nie funkcja biblioteczna. Oprócz niektórych kreacji specyficznych dla C99, jest on oceniany podczas kompilacji. –

+0

Dzięki za komentarz na temat sizeof będący operatorem ... naprawiłem moją odpowiedź. –

-3

Rozważmy:

#if sizeof(MyClass) > 3 
    #define MY_CONSTRAINT 2 
#endif 

class MyClass 
{ 
    #if MY_CONSTRAINT == 3 
     int myMember = 3; 
    #endif 
}; 

Teraz, to jest naprawde nie jest napisane w poprawnej składni jak to było podczas gdy od czasu ostatniego robiłam C++, ale punkt stoi :)

+0

O co ci chodzi? – Ponkadoodle

+2

Patrząc na to, naprawdę nie wiem :) – cwap

+0

haha, doceniam szczerość: P Cieszę się, że nie interpretowałeś mojego komentarza jako wroga. – Ponkadoodle

-3

wystarczy użyć zwykły if-else

if  (sizeof(x)==2) {...} 
else if (sizeof(x)==4) {...} 
else     {...} 

i kompilator optymalizuje go w czasie kompilacji ...

+0

cały punkt to deklaracje czasu kompilacji. – vitiral

Powiązane problemy