Ich möchte in meinem Code eine bedingte Direktive hinzufügen, um verschiedene Builds zu steuern, zum Beispiel:
%Vor%Das Problem ist, dass "VERSION" in einem anderen Code ist, wo ich nicht ändern kann. Es wurde als String definiert:
%Vor%Ich frage mich, ob es eine Art Makro oder Direktive gibt, die die Zeichenfolge in Zahl umwandelt, also kann ich einfach
machen %Vor%Ist das bitte möglich?
PS. Es scheint, dass meine Beschreibung nicht ganz klar ist. Der Hauptzweck dieser Anforderung besteht darin, den Versionszweig zu steuern. Zum Beispiel möchte dieses Programm in alter Version, Vorversion 100, old_function (). Nach dieser Version wurden alle Funktionen in new_function migriert. Also muss ich solche Codes schreiben:
%Vor%Sie können sehen, dass nur eine der Funktionen kompiliert wird. Daher muss die Bedingung in der Vorlaufphase und nicht in der Laufzeit entschieden werden.
Der schwierige Teil ist, dass die VERSION als String definiert wurde, was diese Frage mit sich brachte.
Wenn Sie mit dem Vorprozessor interagieren müssen, um andere #defines
oder bedingt #include
verschiedene Header festzulegen. Bis Sie VERSION als "fest" erhalten, um eine Ganzzahl zu sein ...
Das Einzige, was mir einfällt, ist, eine kleine Header-Datei zu erstellen, die PROPER_VERSION definiert und sie enthält, indem ich jede Datei als Versionsnummer benenne. Also hier würden Sie erstellen:
%Vor%und dann müssten Sie Folgendes hinzufügen:
%Vor% Und dann verwenden Sie PROPER_VERSION
, wie Sie brauchen
Es ist nicht elegant, aber ich kann nichts anderes sehen, was Sie tun können. Sie können die VERSION-Datei automatisch generieren.
Solange Sie keine Deklarationen oder Präprozessordefinitionen für VERSION
vornehmen müssen, und solange Sie sicher sind, dass die Zeichenfolge VERSION
nur eine Ganzzahl ohne führende Nullen ist (beides könnte zu viel verlangt werden), Sie könnten dazu in der Lage sein, dies zur Kompilierzeit zu tun, wenn Ihr Compiler über einen einigermaßen effektiven Evaluator für konstante Ausdrücke verfügt.
Zum Beispiel wird gcc 4.8 den folgenden if
-Test optimieren, wobei nur der entsprechende Arm übrig bleibt:
Die Tatsache, dass nur einer der Zweige der if
-Anweisung die Kompilierung überlebt, wird leicht demonstriert, indem ein Aufruf an eine undefinierte Funktion im nicht verwendeten Zweig eingefügt wird. Mit gcc (und clang) und mit optimierter Optimierung wird kein Linkerfehler erzeugt:
(Siehe Ссылка )
In C ++ 11 gibt es eine noch klarere Kompilierzeit-Version. Sie können eine constexpr
Version von atoi
erstellen. Kombiniert mit etwas, das man als Missbrauch von Vorlagen bezeichnen könnte, erlaubt dies bedingte Deklarationen:
(Dummes Beispiel in Ссылка )
Tags und Links c c-preprocessor preprocessor-directive