6 Stimmen

Separate spezifische #ifdef-Zweige

Kurz gesagt: Ich möchte zwei verschiedene Quellbäume aus dem aktuellen generieren, die nur darauf basieren, dass ein Präprozessormakro definiert und ein anderes undefiniert ist, ohne dass andere Änderungen am Quellcode vorgenommen werden.

Falls es Sie interessiert, hier ist meine Geschichte...

Am Anfang war mein Code sauber. Dann haben wir ein neues Produkt gemacht, und ja, es war besser. Aber der Code sah nur die gleichen Peripheriegeräte, also konnten wir den gleichen Code beibehalten.

Nun, fast.

Es gab eine kleine Bedingung, die geändert werden musste, also habe ich sie hinzugefügt:

#if defined(PRODUCT_A)
condition = checkCat();
#elif defined(PRODUCT_B)
condition = checkCat() && checkHat();
#endif

...zu einer und nur einer Quelldatei. In der allgemeinen all-source-files-include-this Header-Datei hatte ich:

#if !(defined(PRODUCT_A)||defined(PRODUCT_B))
#error "Don't make me replace you with a small shell script. RTFM."
#endif

...so dass die Leute es nicht kompilieren konnten, wenn sie nicht ausdrücklich einen Produkttyp definierten.

Alles war gut. Oh... außer, dass Änderungen vorgenommen wurden, Komponenten ausgetauscht wurden, und da die neue Hardware besser funktionierte, konnten wir die Steuersysteme erheblich umschreiben. Wenn ich mir jetzt den Code ansehe, gibt es mehr als 60 separate Bereiche, die entweder durch einen oder durch einen anderen abgegrenzt sind:

#ifdef PRODUCT_A
...
#else
...
#endif

...oder dasselbe, aber für PRODUCT_B . Oder sogar:

#if defined(PRODUCT_A)
...
#elif defined(PRODUCT_B)
...
#endif

Und natürlich nahm die Vernunft manchmal einen längeren Urlaub und:

#ifdef PRODUCT_A
...
#endif
#ifdef PRODUCT_B
...
#endif

Diese Bedingungen reichen von einem bis zu zweihundert Zeilen (man könnte meinen, dass der letzte Punkt durch den Austausch von Header-Dateien erledigt werden könnte, aber die Funktionsnamen müssen gleich sein).

Das ist Wahnsinn. Es wäre besser, wenn ich zwei getrennte produktbasierte Zweige im Quellcode-Repository pflegen und alle gemeinsamen Änderungen portieren würde. Das ist mir jetzt klar.

Gibt es etwas, das die beiden unterschiedlichen Quellbäume, die ich benötige, nur auf der Grundlage von PRODUCT_A definiert werden und PRODUCT_B undefiniert ist (und umgekehrt), sans irgendetwas anderes berühren (d.h. keine Einbindung von Headern, keine Makroerweiterung usw.)?

6voto

Dusty Punkte 2133

Ich glaube Coan wird das tun, wonach Sie suchen. Von dem Link:

Angesichts einer Konfiguration und eines Quellcodes kann Coan eine Reihe von Fragen darüber beantworten, wie der Quellcode dem C/C++-Präprozessor erscheinen würde, wenn diese Konfiguration von Symbolen im Voraus angewendet worden wäre.

Und außerdem:

Der von Coan neu geschriebene Quellcode ist kein vorverarbeiteter Code, wie ihn der C-Präprozessor erzeugt. Er enthält immer noch Kommentare, Makroaufrufe und #-Direktiven. Es handelt sich immer noch um Quellcode, der jedoch entsprechend der gewählten Konfiguration vereinfacht wurde.

Sie könnten ihn also zweimal durchführen, indem Sie zuerst Produkt A und dann Produkt B angeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X