Wie kann der C-Präprozessor Code während der Kompilierung ausführen?

8

Ich arbeite gerade an einem Code-Projekt, das erfordert, dass ich bestimmte Strings durch Hashes dieser Strings ersetze. Da diese Zeichenfolgen zur Laufzeit nicht geändert werden, wäre es aus Effizienzgründen vorteilhaft, wenn der c-Präprozessor meine Hash-Funktion für jede Zeichenfolge ausführen würde, deren Deklaration zur Kompilierungszeit deklariert wird.

Gibt es eine Möglichkeit, den C Präprozessor dazu zu bringen, meine Hash-Funktion zur Kompilierzeit auszuführen?

Ich weiß, das funktioniert nicht so, wie ich es oben beschrieben habe, aber um eine Vorstellung davon zu bekommen, wohin ich gehe, hier ist ein Pseudocode, der ein Makro verwendet. Stellen Sie sich vor, dass der Präprozessor, anstatt das Makro einfach zu erweitern, die Hash-Funktion ausführt und sie auf den Rückgabewert dieser Hash-Funktion erweitert:

%Vor%

Auch hier würde idealerweise cout << U64_HASH("thanks for helping me") << endl; auf cout << 12223622566970860302 << endl;

expandieren

Ich habe einen Headerfile-Generator geschrieben, und das funktioniert gut für dieses Projekt.

Endlösung

Ich habe mich entschieden, John Purdys Perl-Skript für dieses Projekt zu verwenden, da es einfach großartig ist und mir erlaubt, das zu füttern Ausgabe möchte ich direkt zu meinem Compiler. Vielen Dank, John.

    
Michael Taufen 30.09.2011, 02:09
quelle

4 Antworten

6

Eine Möglichkeit, dies zu erreichen, besteht darin, alle Ihre Strings in eine Header-Datei zu schreiben und sie zu benennen:

%Vor%

Dann können Sie diese Zeichenfolgen verwenden:

%Vor%

Dann können Sie ein Programm auf Ihrem StringHeader.h ausführen, um jede Zeichenfolge zu hashen und eine Ersatz-Header-Datei zu generieren:

%Vor%

Das sieht zuerst sehr manuell und langwierig aus, aber es gibt Möglichkeiten, es zu automatisieren.

Sie könnten zum Beispiel etwas schreiben, um Ihren Quellcode zu analysieren, indem Sie nach "in Anführungszeichen gesetzten Strings" suchen. Dann könnte es jeden String benennen, in ein einzelnes StringHeader.h schreiben und den Inline-String in Anführungszeichen durch den neuen String mit der angegebenen String-Konstante ersetzen. Als zusätzlichen Schritt beim Erstellen der Datei können Sie jede Zeichenfolge hashen - oder Sie haben die Datei auf einmal, nachdem Sie sie erstellt haben. Auf diese Weise können Sie eine Hash-Version der Datei erstellen, die keine Hash-Version ist (was eine Debug-Version ohne Hash-Code und eine Version mit Hash-Version sein könnte).

Wenn Sie das versuchen, muss Ihr erster Parser, der nach Strings sucht, Kantenfälle behandeln (Kommentare, # include-Zeilen, doppelte Strings usw.).

    
Tim 30.09.2011, 02:29
quelle
6

Wenn ein Compiler dies jemals unterstützt, hat C ++ 11 benutzerdefinierte Literale :

%Vor%

oder mit constexpr :

%Vor%     
MSN 30.09.2011 02:35
quelle
0

Wenn Sie den Preprozessor nicht dazu bringen können, dies für Sie zu tun, können Sie möglicherweise Ihren eigenen Preprozessor für diesen Schritt schreiben.

    
geofftnz 30.09.2011 02:12
quelle
0

Es gibt keine Möglichkeit, es zu erzwingen, aber wenn Ihr Compiler gut genug ist, kann es das tun. Spielen Sie mit den Optimierungsoptionen und studieren Sie die Disassemblierung des Codes im Debugger, um zu sehen, ob Sie mit einer der Optionen erreichen, was Sie wollen.

    
Alexey Frunze 30.09.2011 02:21
quelle

Tags und Links