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

War es hilfreich?

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).

befinden

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top