2010-02-23 7 views
10

Ich habe dies:Warum kann ich sizeof() nicht in einem #if verwenden?

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

ich diesen Compiler-Fehler:

missing binary operator before token "(" 

Warum kann ich die sizeof-Operator hier nicht?

+2

Dies hat b Ein oft gefragt. Mach einfach eine Suche. Hier ist eine Antwort, zum Beispiel http://stackoverflow.com/questions/1717665/c-throwing-compilation-error-on-sizeof-comparison-in-preprocessor-if – AnT

+0

Ich denke, Sie suchen nach LISP oder Scheme :) – leppie

Antwort

12

Da sizeof() nach dem Ausführen des Präprozessors berechnet wird, sind die Informationen für #if nicht verfügbar.

C-Compiler sind logisch in zwei Phasen aufgeteilt, auch wenn die meisten modernen Compiler sie nicht trennen. Zuerst wird die Quelle vorverarbeitet. Dies beinhaltet das Ausarbeiten und Einsetzen aller Präprozessor-Bedingungen (#if, #define, Ersetzen definierter Wörter durch ihre Ersetzungen). Die Quelle wird dann an den Compiler selbst weitergeleitet, verarbeitet. Der Präprozessor ist sich der Struktur von C nur minimal bewusst, er hat keine Typkenntnisse, daher kann er keine Konstrukte auf Compiler-Ebene wie sizeof() verarbeiten.

2

Da Sie in einer Präprozessor-Direktive nur Literalkonstanten verwenden können. Außerdem ist sizeof (int) immer größer als 0, also glaube ich, dass #if immer die ganze Zeit wahr ist.

+0

Das war ein schlechtes Beispiel für mich. Ich habe versucht, alle meine projektspezifischen Details auszublenden und kam zu diesem Beispiel. – Robert

+1

Nicht streng zutreffend: Sie können boolesche Operationen ausführen und es gibt einige funktionsähnliche Aufrufe ('defined()'). Einige Präprozessoren erlauben eine Ladung zusätzlicher Daten (ich habe Leute gesehen, die nach Log-Operatoren im Präprozessor fragen, weil sie sie mit einem eingebetteten Compiler benutzt haben). –

0

Die #if ist eine Präprozessordirektive.
sizeof() ist ein C-Operator und wird zur Kompilierzeit berechnet.

Zum Zeitpunkt des Präprozessors (wenn die #if behandelt wird) werden die C-Operatoren nicht ausgeführt.

+0

'sizeof' ist keine Bibliotheksfunktion, es ist ein Operator. – avakar

+0

Nicht streng zutreffend: sizeof() ist eine Sprachfunktion, keine Bibliotheksfunktion. Abgesehen von einigen C99-spezifischen Zauberei, wird es zur Kompilierzeit ausgewertet. –

+0

Danke für den Kommentar über die Größe, ein Operator zu sein .... meine Antwort behoben. –

-3

Bedenken Sie:

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

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

Nun wird diese prolly nicht in der korrekten Syntax geschrieben, wie es eine Weile her, seit das letzte Mal gewesen I C tat ++, aber der Punkt steht noch :)

+0

Was meinst du? – Ponkadoodle

+2

Rückblickend, ich weiß es wirklich nicht :) – cwap

+0

haha, ich schätze die Ehrlichkeit: P Froh, dass Sie meinen Kommentar nicht als feindselig interpretiert haben. – Ponkadoodle

-3

nur verwenden if-else gewöhnlichen

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

und Compiler wird es in der Kompilierung optimieren ...

+0

der ganze Punkt ist Kompilierzeit Deklarationen. – vitiral