2016-08-09 8 views
2

Ich verwende eine 3rd-Party-Bibliothek, und ich kompiliere ihre Quellen nicht, nur einschließlich der Header von /usr/include.#if Anweisungen in C++ Code

Ich weiß, dass der Quellcode einen Block wie folgt enthält:

#if VAL1 && VAL2 
    do something 
#else 
    do something I dont want to do 
#endif 

Ich weiß, dass VAL2-1 gesetzt ist, aber VAL1 auf 0 gesetzt ist, in einer anderen Datei irgendwo innerhalb enthalten.

Was ich versuche zu definieren ist VAL1 selbst, indem ich den Inhalt der Kopfzeile, die VAL1 auf setzt, und den Wert selbst einstellen.

Wird dies so aussehen, dass wenn der Code der Bibliothek läuft, er in den ersten Block läuft? oder ist es in der kompilierungszeit völlig statisch?

Antwort

4

Präprozessor-Makros sind Kompilierungszeit-Dinge. Sie verwenden sie normalerweise, um sicherzustellen, dass der Compiler weiß, wie er sich in bestimmten Situationen verhält. Zum Beispiel, wenn Sie verschiedene Bibliotheken für verschiedene Plattformen verwenden.

Mehr Infos here

+0

Verstanden. Ich wollte nur sichergehen, denn die Quelldateien der Bibliothek zu erstellen, ist etwas, das ich als letzten Ausweg nehmen wollte. Danke, Alter. –

+1

Nach dem Bearbeiten: aber nach der Logik, es würde immer noch nicht helfen, da die Bibliothek bereits kompiliert wurde und ich es immer noch kompilieren müsste –

+0

Messepunkt. Muss es überprüfen, um sicherzugehen. Jetzt bearbeiten – RoughTomato

3

kurze Antwort: keine

Das sind Präprozessordirektiven welche vor der Kompilierung vorverarbeitet (wie der Name schon sagt). Sobald dein Programm kompiliert ist; Sie können dieses Verhalten nicht mehr ändern.

4

Wird dies so aussehen, dass wenn der Code der Bibliothek läuft, er in den ersten Block läuft? oder ist es in der kompilierungszeit völlig statisch?

Die Antwort ist: Es ist völlig statisch in der Übersetzungszeit.

Wenn Sie beide Versionen des Codes kompilieren möchte dann je nach dem Kontext, wo diese if/def Makro verwendet wird, könnten Sie:

if (VAL1 && VAL2) 
{ do something } 
else 
{ do something I dont want to do } 

dann unter der Annahme VAL1 und VAL2-1 löst, wird der Code do something kompiliert und ausführen, aber der Code do something I dont want to do wird nur kompilieren - aber der Compiler wird es optimieren, indem er es nicht in die ausführbare Datei aufnimmt.

2

Nein, dies wirkt sich nur auf den Header aus, der während des nächsten Kompilierungslaufs analysiert wird. Es hat keine Auswirkungen auf den kompilierten Teil der Bibliothek, mit dem Sie bereits verlinken.

Dies bedeutet, es ist wahrscheinlich eine schlechte Idee. Im Allgemeinen möchten Sie Compiler-Flags konsistent halten, und das schließt Makros ein. Wir können nicht sagen, ob es hier einen Unterschied macht, aber wenn Sie nicht sicher sind, würde ich bei den gleichen Makrodefinitionen bleiben.

Wenn das bedeutet, dass Sie die Bibliothek selbst neu kompilieren müssen, dann müssen Sie das tun.

+0

Wahrscheinlich werde ich die Quellen holen und sie kompilieren, da es meine einzige echte Option ist, die Sachen zur Arbeit zu bringen. Der Code befindet sich in einer Quelldatei und nicht in einer Headerdatei, was mein Problem ist. Wenn es einen Unterschied macht, ist die Bibliothek log4cxx und mein Problem versucht, Zeug in Hebräisch zu protokollieren (und es wird schlecht codiert und verwandelt sich in Fragezeichen) –