C ++ Ermittelt die Größe eines Typs in einem Makro

7

Gibt es eine Möglichkeit, so etwas in C ++ zu machen, scheint es, dass die Größe dort aus irgendeinem Grund nicht verwendet werden kann?

%Vor%     
Fire Lancer 02.08.2009, 15:47
quelle

7 Antworten

4

Ich denke, Dinge wie BOOST_STATIC_ASSERT könnten helfen.

    
EFraim 02.08.2009, 16:15
quelle
14

Nein, das kann nicht gemacht werden, weil alle Makro-Erweiterungen (# ... Dinge) im Pre-Prozessor-Schritt durchgeführt werden, der nichts über die Typen des C ++ - Codes weiß und sogar nichts wissen muss über die Sprache! Es erweitert / prüft nur die # ... Dinge und nichts anderes!

Es gibt einige andere häufige Fehler, zum Beispiel:

%Vor%

Sie können nur auf #if zugreifen und Dinge verwenden, die über Befehlszeilenoptionen für den Compiler oder über #define definiert sind.

    
mmmmmmmm 02.08.2009 15:50
quelle
7

Der Präprozessor arbeitet, ohne etwas über die Typen zu wissen, auch nicht den eingebauten.

Übrigens, Sie können die Überprüfung immer noch mit einer static_assert-ähnlichen Funktion durchführen (boost hat beispielsweise eine, C ++ 0X wird eine haben).

Bearbeiten: C99 und C ++ 0X haben auch WCHAR_MIN und WCHAR_MAX Makros in <stdint.h>

    
AProgrammer 02.08.2009 15:51
quelle
3

Würdest du im Grunde nicht das bekommen, was du willst (Kompilierfehler ohne die ausgefallene Nachricht), indem du ein C_ASSERT verwendest?

%Vor%     
gatorfax 02.08.2009 16:27
quelle
3

sizeof () ist eine Laufzeit Kompilierzeitfunktion. Sie können das nicht in einer Präprozessordirektive aufrufen. Ich glaube nicht, dass Sie die Größe von wchar_t während der Vorverarbeitung überprüfen können. (siehe Edit 2)

Bearbeiten: Wie in den Kommentaren erwähnt, wird sizeof () zur Zeit der Kompilierung berechnet. In C99 kann zur Laufzeit für Arrays verwendet werden .

Bearbeiten 2: Sie können zur Build-Zeit Asserts unter Verwendung der in diesem thread .

    
nagul 02.08.2009 15:51
quelle
1
%Vor%     
Adrian Panasiuk 02.08.2009 16:18
quelle
0

Ich habe einige Makros entwickelt, mit denen Sie sizeof innerhalb einer Makrobedingung effektiv verwenden können. Sie befinden sich in einer Header-Datei, die ich hier (MIT-Lizenz) hochgeladen habe.

Es wird Code wie folgt zulassen:

%Vor%

Beachten Sie die Kommata in SIZEOF(unsigned, long, int) .

    
Matthew K. 26.05.2017 22:00
quelle

Tags und Links