从命令行替代宏

Override macro from the command line

本文关键字:命令行      更新时间:2023-10-16

我想从命令行重写一个宏。在我的资料来源中,有这样一个定义:

#define MY_FOO 1

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

g++ -DMY_FOO=2 ...

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

#ifndef MY_FOO
#define MY_FOO 1
#endif

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

你不能。

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

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

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

g++ -DMY_FOO=2 -DCONFIG_H

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