2010-04-06 3 views
14

Mögliche Duplizieren:
Why can’t I use sizeof in a preprocessor condition ?Überprüfen der sizeof ein Integer-Typ im Preprocessor

Wie kann ich die Größe eines unsigned im Preprocessor unter g überprüfen ++? sizeof kommt nicht in Frage, da es während der Vorverarbeitung nicht definiert ist.

+0

Es ist dort nicht gut beantwortet. – myahya

+2

@Lucero: Das beantwortet nur, warum sizeof nicht in Frage kommt, dass Myahya bewusst ist. – UncleBens

+0

Vielleicht http://stackoverflow.com/questions/1505582/determining-32-vs-64-bit-in-c deckt Ihre Frage? –

Antwort

25

Dies ist möglicherweise nicht die eleganteste Methode, aber eine Sache, die Sie möglicherweise nutzen können, ist UINT_MAX definiert in "limits.h". Das heißt, ...

wenn UINT_MAX == 65535, dann würden Sie, dass sizeof (unsigned) weiß = 2

wenn UINT_MAX == 4294967295, dann würden Sie, dass sizeof wissen (unsigned) = 4.

und so weiter.

Wie gesagt, nicht elegant, aber es sollte ein gewisses Maß an Benutzerfreundlichkeit bieten.

Hoffe, das hilft.

+1

Dies ist eine gültige Antwort, die nicht in der "Duplikat" -Frage ist. Also, ich habe gewählt, um wieder zu öffnen. –

+1

Der Präprozessor sollte in der Lage sein, etwas zu tun, etwas wie '#if UINT_MAX >> 8 == 0 // 1 Byte' ...' #elif UINT_MAX >> 16 == 0 // zwei Bytes' usw.? – UncleBens

+3

Technisch könnte die Größe der Ganzzahl größer sein, als diese Technik vorhersagt, da "unsigned" Padding-Bits haben darf, oder kleiner, da CHAR_BIT nicht 8 sein muss. Also für die Korrektheit könnte es auch wert sein, irgendwo zu behaupten (in einem Test, vielleicht), dass "sizeof" die erwartete Größe ergibt. In der Praxis kann man mit großer Zuversicht sagen, dass es nicht passieren wird. –

9

Basierend auf Sparky Antwort, hier ist ein Weg, ein bisschen schöner (durch den Wegfall der expliziten Zahlen)

#include <limits.h> 
#include <stdint.h> 

//Check if size if 4bytes 
#if UINT_MAX == UINT32_MAX 

.... 

#endif 

<limits.h> definiert INT_MAX und <stdint.h> definiert UINT32_MAX aussehen würde. Im Allgemeinen gibt <stdint.h> ganzzahlige Typen mit bestimmten Breiten an.

+0

Dies funktioniert unter gcc, unter g ++ kann es problematisch sein. Sparkys Lösung ist allgemeiner – myahya