从命令行覆盖宏

时间:2013-08-28 08:41:02

标签: c++ macros g++ c-preprocessor

我想从命令行覆盖一个宏。在我的源代码中,有一个这样的定义:

#define MY_FOO 1

我想要的是在编译程序时设置此宏的值:

g++ -DMY_FOO=2 ...

但是,然后,源代码将宏重新定义为其旧值1.问题是我不拥有首先定义宏的源代码部分。如果是我自己的代码,我可以简单地写

#ifndef MY_FOO
#define MY_FOO 1
#endif

我的问题就不复存在了。那么是否可以使用g ++在命令行上指定一个宏,以便源代码无法重新定义它?

3 个答案:

答案 0 :(得分:10)

你不能。

在任何源文件和头文件之前处理命令行 如果源文件定义了宏,则之前不能定义它,并且从现在开始将获得新值 改变它的唯一方法是,稍后再次#undef#define。如果您有权访问定义后包含的标题,那么您有机会。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果文件config.h阻止了多个包含(通过#ifndef CONFIG_H等),那么你可以滥用它:

g++ -DMY_FOO=2 -DCONFIG_H

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