从命令行覆盖宏

11

我希望你能在命令行中覆盖一个宏。在我的源代码中,有这样一个定义:

#define MY_FOO 1
我希望在编译我的程序时设置这个宏的值:
g++ -DMY_FOO=2 ...

但是,源代码将宏重新定义为其旧值1。问题在于我不拥有首次定义该宏的源代码部分。如果这是我的自己的代码,我可以简单地编写

#ifndef MY_FOO
#define MY_FOO 1
#endif

我的问题将会消失。那么,是否有办法使用g++在命令行上指定宏,使得源代码无法重新定义它?


1
为什么你想这样做?如果你告诉我们真正的问题,可能会有另一种解决方法。 - doctorlove
3
你需要在头文件中包含自己的定义,还是在#include之后仅使用#undef就可以了? - svk
真正的问题在于我正在处理一个项目,其中几个输出流的调试级别是使用config.h设置的,而config.h又是由autotools生成的。但是我只想编译一个简单的测试程序,并希望它具有更高的调试级别,我不想重新配置整个软件包,因为这需要相当长的时间。 - Sh4pe
@svk 这可能是个好主意,我会看一下... 不过最好还是能回答我的原始问题 :) - Sh4pe
2
@Sh4pe 我猜你最初的问题的答案可能是“不”。 - svk
3个回答

11

你无法这么做。

命令行在任何源代码和头文件之前处理。如果一个源文件定义了一个宏,那么它就不能在之前被定义,并且将从现在开始获得新值。
唯一的改变它的方法是在稍后的时间内 #undef#define 它。如果您可以访问在定义之后包含的头文件,则有机会更改它。


0
如果文件config.h通过#ifndef CONFIG_H等方式防止多次包含,则可以滥用它:
g++ -DMY_FOO=2 -DCONFIG_H

注意:如果文件config.h包含其他你需要的内容,那么你也必须自己重新定义。你可以将该文件复制为my_config.h并包含它。(另请参阅预处理器选项-include file)。

0
如果您正在尝试创建一个可以从命令行配置的东西,并且您可以更改源代码,那么您可以使用 #ifndef 来定义宏,只有在它尚未定义时才定义。因此,当您定义宏时,代码将看到它并且不会覆盖它,但是如果您没有定义它,则它将具有默认值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接