Frage
Ich möchte eine C pre-Präprozessor was ist die Filterung einige #define-Anweisungen aus dem Quellcode ohne was zu ändern sonst.
Warum?Dies sollte verwendet werden, um entfernen einige client-spezifischen code aus den Quellen, wenn die Quelle übergeben wird einem anderen client.
Kennt jemand eine bestehende Lösung?
Vielen Dank!Simon
Lösung
Sie können so etwas wie awk anstelle von CPP? Fügen Sie einige Fahnen in Ihrem Code, um das Stück Code umgebenden entfernt werden. Zum Beispiel:
(...)
//BEGIN_REMOVE_THIS_CODE
printf("secret code");
//END_REMOVE_THIS_CODE
(...)
dann einen awk-Skript schreiben, diesen Code zu entfernen, so etwas wie ...
BEGIN { write=1;}
/^\/\/BEGIN_REMOVE_THIS_CODE/ { write=0; next;}
/^\/\/END_REMOVE_THIS_CODE/ { write=1; next;}
{
if(write==1) print $0;
}
Andere Tipps
Das klingt wie das, was ich gefragt, in gibt es einen C Pre-Prozessor, die basierend auf den Werten definiert ifdef Blöcke eliminiert. Die beste Antwort, die ich bekam, war sunifdef
oder ‚Sohn unifdef‘, was für mich sicher auf einig übermäßig verzerrt bedingten Code (die akkumulierte crud von mehr als 20 Jahren der Entwicklung auf einer Vielzahl von Plattformen mit unzureichender Theorie, wie man gearbeitet hat, Sie plattformspezifische Kompilierung).
Ich glaube nicht, dass Sie einen Präprozessor für diese benötigen. Wenn Sie verschachtelte #ifdef
die nicht in Ihrem Code haben, jeder Regex-Engine kann alles entfernen, die zwischen #ifdef CLIENT
und #endif
(verwenden Sie nicht gierigen Matching paßt erste #endif
, nicht zuletzt).
würde ich den Client-spezifischen Code in einem separaten Verzeichnis abgelegt oder möglicherweise Teil eines anderen Projektes, das aus der Quellcodeverwaltung werden müßte überprüft werden.
einen Funktionsaufruf Setzen Sie die Stub würde oder (ich die richtige Begriff vergessen) lose verknüpft, so dass eine weitere Funktion kann in seinen Platz eingesetzt werden.
Ich empfehle die Verwendung eines zusätzlichen makro-Ebene für die code-Filterung, wie filepp.Sie können einen C-Präprozessor-friendly syntax zu äußern, welche Teile gehört zu dem Kunden.
//%ifdef CLIENT_A
code for client A
//%endif
//%ifdef CLIENT_B
code for client B
//%endif
//%if "CLIENT_A" || "CLIENT_B"
code for client A and B
//%endif
Der '/ / % ' - Präfix, der Ihnen ermöglicht, den code zu kompilieren unverändert.Sie laufen kann filepp bevor Sie geben den code auf einem client.
Wenn Sie gcc verwenden, dann können Sie:
gcc <insert files here> -E
Die Option -E sagt gcc nur Vorprozess der Quellen, und nicht, sie zu kompilieren.
Oder Sie könnten grep verwenden, um bestimmte Dateien herauszufiltern, und lassen Sie den Präprozessor lose auf ihnen nur.
grep -r '#define CLIENT_CODE' ./*.h
Sie können auch versuchen, unifdef das ist eher einfacher als sunifdef.
soweit ich weiß ... kann der Präprozessor als separater Schritt ausgeführt werden (die richtigen Compiler optios verwenden). Auf diese Weise können Sie tun, was Sie mit dem bearbeiteten Code möchten.