11

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

#define MY_FOO 1

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

g++ -DMY_FOO=2 ...

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

#ifndef MY_FOO
#define MY_FOO 1
#endif

我的问题就会消失。那么有没有办法使用g++在命令行上指定一个宏,这样源代码就不能重新定义它呢?

4

3 回答 3

11

你不能。

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

于 2013-08-28T13:01:50.553 回答
0

如果您尝试制作可从命令行配置的内容,并且您可以更改源代码,那么您可以使用#ifndef 来定义宏,前提是宏尚未定义。因此,当您定义宏时,代码会看到它并且不会覆盖它,但如果您不定义它,它将具有默认值。

于 2014-03-19T11:44:02.963 回答
0

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

g++ -DMY_FOO=2 -DCONFIG_H

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

于 2014-05-07T08:52:42.693 回答