2013-08-28 10 views
5

Ich möchte ein Makro von der Befehlszeile überschreiben. Irgendwo in meiner Quelle, gibt es eine Definition wie folgt:Makro von der Befehlszeile überschreiben

#define MY_FOO 1 

Was Ich mag würde, ist der Wert dieses Makro zu setzen, wenn ich mein Programm zusammenstellen:

g++ -DMY_FOO=2 ... 

Aber dann wird das Makro neu definiert durch den Quellcode zu seinem alten Wert 1. Das Problem ist, dass ich nicht den Teil der Quelle besitze, die das Makro an erster Stelle definiert. Wenn es mein eigener Code wäre, könnte ich einfach schreiben

#ifndef MY_FOO 
#define MY_FOO 1 
#endif 

Und mein Problem wäre weg. Gibt es also einen Weg, ein Makro in der Kommandozeile mit g ++ zu spezifizieren, so dass der Quellcode es nicht neu definieren kann?

+1

Warum möchten Sie dies tun? Es kann einen anderen Weg geben, wenn Sie uns das wirkliche Problem sagen – doctorlove

+3

Benötigen Sie es, um Ihre Definition innerhalb der Header-Datei selbst zu haben, oder würde es funktionieren, einfach "# undef" es nach Ihrem "# include"? – svk

+0

Das eigentliche Problem ist, dass ich an einem Projekt arbeite, bei dem die Debug-Ebene mehrerer Ausgabestreams mithilfe von config.h festgelegt wird, das wiederum von den Autotools generiert wird. Aber ich möchte nur ein einfaches Testprogramm in meinem Paket mit einem höheren Debug-Level kompilieren und ich möchte das ganze Paket nicht neu konfigurieren, weil das einige Zeit in Anspruch nimmt. – Sh4pe

Antwort

7

Sie können nicht.

Die Befehlszeile wird vor allen Quell- und Headerdateien behandelt.
Wenn eine Quellendatei ein Makro definiert, darf sie vorher nicht definiert werden und erhält ab sofort den neuen Wert.
Die einzige Möglichkeit, es zu ändern, ist #undef und #define es wieder, zu einem späteren Zeitpunkt. Wenn Sie Zugriff auf eine Kopfzeile haben, die nach der Definition enthalten ist, haben Sie eine Chance.

0

Wenn Sie versuchen, etwas über die Befehlszeile konfigurierbar zu machen, und Sie den Quellcode ändern können, können Sie #ifndef verwenden, um das Makro nur zu definieren, wenn es nicht bereits definiert ist. Wenn Sie also das Makro definieren, wird es vom Code angezeigt und nicht überschrieben, aber wenn Sie es nicht definieren, wird es einen Standardwert haben.

0

Wenn die Datei config.h mehrere Einschlüsse verhindert (via #ifndef CONFIG_H etc), dann könnte man, dass Missbrauch:

g++ -DMY_FOO=2 -DCONFIG_H 

Hinweis: Wenn die Datei config.h etwas anderes enthält, die Sie benötigen, dann Sie müssen das auch selbst definieren. Sie könnten eine Kopie der Datei als my_config.h erstellen und diese einschließen. (Siehe auch die -include file Präprozessoroption).

Verwandte Themen