Wie kann ich drucken Sie das Ergebnis von sizeof() beim kompilieren in C?
Wie kann ich drucken Sie das Ergebnis von sizeof() beim kompilieren in C?
Für jetzt bin ich mit einer statischen assert (hausgebrauten basierend auf anderen web-Ressourcen) zu vergleichen, der sizeof () - Ergebnis, um verschiedene Konstanten. Das funktioniert zwar... ist es bei weitem nicht elegant oder schnell. Kann ich auch erstellen Sie eine Instanz der variable/struct und suchen Sie in der map-Datei, aber das ist auch weniger elegant und schnell, als ein direkter Aufruf/Befehl/Betreiber. Weiter, dies ist ein embedded-Projekt mit mehreren cross-Compiler,... so bauen und laden Sie ein Beispielprogramm, um das Ziel und dann das Lesen aus einen Wert ein, ist noch mehr Aufwand als die oben genannten.
In meinem Fall (alte GCC) #warning sizeof(MyStruct)
eigentlich nicht interpretieren sizeof() vor dem drucken die Warnung.
- Was ist die motivation?
- Zu wissen, die Größe einer multi-Tier-Struktur, ohne zu Graben in der map-Datei.
- Gut, die #Warnung-Anweisung erfolgt durch den Präprozessor vor dem richtigen compiler hat sogar schon begonnen - also ich glaube nicht, dass dies möglich ist. Ich denke, schreiben ein kleines test-Programm, das aufgerufen wird, als benutzerdefinierter Schritt in den build-Prozess ist eine Lösung. Viel Glück.
- Was meinst du mit "weit ab ... schnell"? Statische assertions getestet werden zur compile-time (und so ist
sizeof
ausgewertet zur compile-Zeit). - Und es gibt nichts wie ein Aufruf zum
sizeof
. Es ist ein operator, keine Funktion. - Ich werde zumindest damit einverstanden, dass ich nie erwartet hätte #Warnung zu funktionieren, wie es ist ein precompiler Befehl, nicht eine compiler-Direktive.
- aus ... fast" bezieht sich auf das schreiben der Haufen statisch behauptet. Wie MY_STATIC_ASSERT(sizeof(MyStruct) > 100). Wenn ich eine Suche verändern 100 bis 200, dann 300, dann 250, dann 275, dann... ist es weit von einem schnellen Prozess. Auch habe ich den Verweis entfernt, um ein sizeof() Aufruf.
- benötigen Sie die genaue Größe oder nur eine grobe Figur ?
- Wenn Sie ein C++ - compiler für Ihr Ziel, das Sie vielleicht überprüfen Sie es mit stackoverflow.com/questions/2008398/...
- Geretz genau, in einigen Fällen aber ballpark ausreichend gewesen wäre heute.
- Ich könnte wahrscheinlich etwas hinzufügen, um unsere standard-Makefile zu erleichtern, die Verwendung der C++ - Ansatz. Ich bis Ende Mai gehen, die route, wenn Filipe ist richtig, dass das, was ich will, ist nicht möglich.
- Ein anderer Ansatz, wenn Sie erstellen können elf-Dateien mit debug-Informationen in Ihnen ist die Verwendung der
pahole
tool auf die endgültige ausführbare Datei oder Objekt-Dateien. (Oder auch mit objdump --Zwerg) - könnten Sie diese Fahrt ein klein wenig mithilfe von einem Haufen von #if - #else MY_STATIC_ASSERTS um einen Anhaltspunkt für die Warnung.
- Ich hatte versucht
objdump --dwarf
auf einer kleinen Struktur, und es schien, als ungenau. Ich sollte überdenken, um zu sehen, was ich falsch gemacht habe. - Die statische assert Werke von
typedef
'ing ein array-Typ mit einer positiven (assert übergeben) oder negativ (assert failed) Größe. Dieser tut nichts in Bezug auf den Präprozessor so#if
funktioniert nicht mit ihm. Dieser sagte, was ich Tat, war ein Haufen behauptet Betriebssystem auf einem#define
dass ich zeigen konnte, um die struct von Interesse.
Du musst angemeldet sein, um einen Kommentar abzugeben.
War ich mucking herum auf der Suche für ähnliche Funktionalität, wenn ich stolperte über diesen:
Ist es möglich, drucken Sie die Größe einer C++ - Klasse zur compile-Zeit?
Das gab mir die Idee für dieses:
Die Ergebnisse in die folgende Warnung im VS2015:
denen 88 in diesem Fall wäre die Größe, die Sie suchen.
Super hacky, aber es funktioniert der trick. Wahrscheinlich ein paar Jahre zu spät, aber hoffentlich wird dies nützlich sein, um jemanden.
Habe ich nicht hatte eine chance, um zu versuchen, mit gcc oder clang noch nicht, aber ich werde versuchen, um zu bestätigen, ob oder nicht es funktioniert, wenn jemand nicht erhalten, um es vor mir.
Edit: Funktioniert out of the box für clang 3.6
Der einzige trick, den ich bekommen konnte, um die Arbeit für GCC missbrauchte
-Wformat
und mit der makro-Funktion definieren, wie die folgenden:Welche geben, werden Sie eine Warnung wie:
Etwas Gröber als der ursprüngliche Vorschlag, aber vielleicht jemanden kennt der gcc ein wenig besser denken kann, eine bessere Warnung zu missbrauchen.
-Wframe-larger-than
) noch funktioniert (Sie müssen nach unten scrollen, um die Antwort akzeptiert, weil es nicht auf die Spitze aus irgendeinem Grund...).Alles, was Sie brauchen, ist ein trick, der bewirkt, dass der compiler beschweren sich über einige compile-Zeit integer-Werte werden falsch verwendet, wie dupliziert
case
ständige:So sizeof struct X 48
Einen weiteren Weg (das funktioniert tatsächlich):
Funktioniert mit der alten ' ish gcc-5.x. Ergibt eine Fehlermeldung wie diese:
p.s. natürlich, das ist eine (sehr) gcc spezifisch. Alle anderen Methoden waren nicht für mich arbeiten.
char __foo[] = {[sizeof(MyStruct)] = ""};
Den folgenden Weg, die Werke in GCC, Clang, MSVC und mehr auch in älteren Versionen, basiert auf der gescheiterten Umwandlung einer Funktion mit parameter aus Zeiger auf array zu einem skalaren Typ. Der Kompiler drucken Größe des Arrays, so können Sie den Wert aus der Ausgabe. Funktioniert in C und C++ - Modus.
Beispiel-code herauszufinden
sizeof(long)
(spielen online):Beispiele von relevanten output:
Stolperte ich über eine Lösung ähnlich Bakhazard's tolle Lösung,, und dieser erzeugt eine viel weniger ausführlich Warnung sein, so können Sie es nützlich finden:
Dies erzeugt die Fehlermeldung
Getestet wurde dies mit der neuesten version von
clang(1)
.Mein gcc C-compiler weigert sich zu drucken, die Größe mit einer der oben genannten Lösungen. Ich Umgekehrt die Logik zum injizieren von compiler-Warnungen für das, was Größe ist es nicht.
Dann habe ich einen Blick durch die Warnungen für die fehlende Zahl.
Damit dann auch mein struct Größe ist 8.
Meine Verpackung ist 4.
Meh... es ist eine option.
Obwohl dies nicht genau zur compile-Zeit, es ist vor der Laufzeit, so könnte es noch relevant sein für einige Menschen.
Können Sie definieren ein array, etwa so:
Und dann, nach dem kompilieren, erhalten Sie die Größe der Objekt-Datei:
@jws
nette Idee!. Howewer, sizeof(xxx) ist ein konstanter Ausdruck (außer VLA, https://en.cppreference.com/w/c/language/sizeof), so dass der sizeof-operator sollte funktionieren, selbst in die Auswahl:
.. es funktioniert in meinen GCC: "..\WinThreads.c:18:9: Warnung: case Wert '4' nicht in Aufzählungstyp 'enum-e1' [-Wswitch] "
Können Sie dies nicht tun, nicht mit Strukturen. Der Präprozessor aufgerufen, der vor der Kompilierung stattfindet, so gibt es nicht einmal das Konzept der Struktur; Sie können nicht beurteilen, die Größe von etwas, das gar nicht existiert /nicht definiert wurde. Der Präprozessor hat tokenisierung einer übersetzung Einheit, aber es ist so nur für den Zweck der Ortung makro-Aufruf.
Die nächste Sache, die Sie haben können, um sich auf einige von der Implementierung definierte Makros zu bewerten, dass die Größe des built-in-Typen. Im gcc sind, finden Sie diese mit:
Welche in meinem system gedruckt:
Gibt es wirklich nichts Sie tun können, um zu wissen, die Größe der eine benutzerdefinierte Struktur ohne ein Programm schreiben und ausführen.