Name und Wert eines Makros ausgeben

7

Ich habe ein C-Programm mit vielen Optimierungen, die mit #define s aktiviert oder deaktiviert werden können. Wenn ich mein Programm starte, würde ich gerne wissen, welche Makros zur Kompilierzeit definiert wurden.

Ich versuche also, eine Makrofunktion zu schreiben, um den tatsächlichen Wert eines Makros zu drucken. Etwas wie das:

%Vor%

Aber ich weiß nicht, wie ich es zum Laufen bringen kann und ich vermute, dass das nicht möglich ist, hat jemand eine Idee, wie es geht?

(Beachten Sie, dass dies kompiliert werden muss, auch wenn das Makro nicht definiert ist!)

    
Ben 22.07.2009, 11:32
quelle

11 Antworten

4

Das Schreiben eines MACRO, das zu einem anderen MACRO expandiert, würde erfordern, dass der Präprozessor zweimal darauf läuft.
Das ist nicht getan.

Sie könnten eine einfache Datei schreiben,

%Vor%

Verwenden Sie für diese Datei dieselben Kompilierzeit-Definitionszeilen wie für die anderen Dateien.
Rufen Sie die Funktion irgendwann beim Start auf.

Wenn Sie die #DEFINE -Linien in einer Quelldatei und nicht in Makefile ,
haben Verschieben Sie sie in eine andere Header -Datei und fügen Sie diesen Header allen Quelldateien,
hinzu einschließlich dieser check-defines.c .

Hoffentlich haben Sie für alle Ihre Quelldateien dieselben Definitionen Andernfalls wäre es ratsam, die Strategie Ihrer Defines erneut zu überprüfen.

Um die Generierung dieser Funktion zu automatisieren Sie könnten die M4 Makrosprache (oder sogar ein AWK Skript ). M4 wird zu Ihrem Pre-Pre-Prozessor.

    
nik 22.07.2009, 11:45
quelle
26

Solange Sie bereit sind, die Tatsache zu akzeptieren, dass SOMESTRING = SOMESTRING anzeigt, dass SOMESTRING nicht definiert wurde (sehen Sie es, da das Token nicht neu definiert wurde!?!), dann sollte Folgendes passieren:

%Vor%

Die Ausgabe ist:

%Vor%     
Dipstick 22.07.2009 21:53
quelle
2
%Vor%

Ich denke nicht, was Sie versuchen zu tun ist möglich. Sie fragen zur Laufzeit nach Informationen, die vor der Übersetzung bearbeitet wurden. Die Zeichenfolge "MYMACRO" bedeutet nichts, nachdem CPP sie innerhalb des Programms auf ihren Wert erweitert hat.

    
kjfletch 22.07.2009 11:43
quelle
2

Sie haben den von Ihnen verwendeten Compiler nicht angegeben. Wenn dies gcc ist, kann gcc -E helfen Sie stoppt nach der Vorverarbeitung und druckt das Vorverarbeitungsergebnis. Wenn Sie ein gcc -E-Ergebnis mit der Originaldatei vergleichen, erhalten Sie möglicherweise einen Teil von dem, was Sie wollen.

    
Yuval F 22.07.2009 11:52
quelle
2

Warum testet man es nicht einfach mit dem Präprozessor?

%Vor%

Man kann dies auch in einen anderen Test einbetten, um es nicht jedes Mal zu drucken:

%Vor%     
philant 22.07.2009 12:00
quelle
1

Wave-Bibliothek von Boost kann sein hilfreich auch zu tun, was Sie wollen. Wenn Ihr Projekt groß genug ist, denke ich, dass es einen Versuch wert ist. Es ist ein C ++ - Präprozessor, aber sie sind immer gleich:)

    
AraK 22.07.2009 12:04
quelle
1

Ich glaube, was du versuchst zu tun, ist nicht möglich. Wenn Sie die Arbeitsweise Ihres #define s ändern können, schlage ich folgendes vor:

%Vor%     
Clay 22.07.2009 12:05
quelle
1

Es ist tatsächlich nicht möglich, das Problem ist der "nicht definierte" Teil. Wenn Sie sich auf die Makrowerte verlassen haben, um Teile Ihres Codes zu aktivieren / deaktivieren, können Sie einfach Folgendes tun:

%Vor%     
Frederik Deweerdt 22.07.2009 12:15
quelle
0

Basierend auf Chrisharris, antworte ich, dass ich das getan habe. Obwohl meine Antwort nicht sehr nett ist, ist es genau das, was ich wollte.

%Vor%

Nur der Fehler, den ich gefunden habe, ist, dass die Definition nicht #define XXX XXX (mit XXX gleich XXX) sein muss.

    
Ben 23.07.2009 06:10
quelle
0

Diese Frage ist sehr nahe von Macro, das druckt ein Ausdruck und wertet ihn aus (mit __STRING) . Chrisharris 'Antwort ist sehr nahe bei der Antwort auf die vorherige Frage.

    
bortzmeyer 23.07.2009 11:27
quelle
0

Sie können eine Integer-Variable verwenden, die mit 1 initialisiert ist. Multiplizieren Sie das #define mit dieser Variablen und drucken Sie den Wert der Variablen.

    
Ketan Kowticwar 14.06.2016 11:15
quelle

Tags und Links