我想从命令行覆盖一个宏。在我的源代码中,有一个这样的定义:
#define MY_FOO 1
我想要的是在编译程序时设置此宏的值:
g++ -DMY_FOO=2 ...
但是,然后,源代码将宏重新定义为其旧值1.问题是我不拥有首先定义宏的源代码部分。如果是我自己的代码,我可以简单地写
#ifndef MY_FOO
#define MY_FOO 1
#endif
我的问题就不复存在了。那么是否可以使用g ++在命令行上指定一个宏,以便源代码无法重新定义它?
答案 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
预处理器选项)。