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?
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?
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().
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.
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
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). –
#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.
'sizeof' nie jest funkcją biblioteczną, jest operatorem. – avakar
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. –
Dzięki za komentarz na temat sizeof będący operatorem ... naprawiłem moją odpowiedź. –
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 :)
O co ci chodzi? – Ponkadoodle
Patrząc na to, naprawdę nie wiem :) – cwap
haha, doceniam szczerość: P Cieszę się, że nie interpretowałeś mojego komentarza jako wroga. – Ponkadoodle
wystarczy użyć zwykły if-else
if (sizeof(x)==2) {...}
else if (sizeof(x)==4) {...}
else {...}
i kompilator optymalizuje go w czasie kompilacji ...
cały punkt to deklaracje czasu kompilacji. – vitiral
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
Myślę, że szukasz LISP lub Scheme :) – leppie