Gibt es Anweisungen im C / C ++ - Präprozessor, um eine Zeichenfolge in eine Zahl zu konvertieren?

8

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.

    
user2023470 20.11.2013, 01:24
quelle

2 Antworten

3

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

%Vor%

Es ist nicht elegant, aber ich kann nichts anderes sehen, was Sie tun können. Sie können die VERSION-Datei automatisch generieren.

    
Glenn Teitelbaum 20.11.2013 03:40
quelle
2

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:

%Vor%

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:

%Vor%

(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:

%Vor%

(Dummes Beispiel in Ссылка )

    
rici 20.11.2013 02:51
quelle