当我通过命令行运行程序时,如何更改布尔宏的值?例如,假设我的cpp文件中有以下宏,称之为MyCpp.cpp
#define DEBUG 1
运行程序时如何更改?通过命令行:
g++ -Wall -Wextra -o MyCpp MyCpp.cpp
我很确定你指定了某种命令行选项,这会响铃吗?
另外,我不想使用argv[]
答案 0 :(得分:4)
首先,更改源代码:
#ifndef DEBUG
# define DEBUG 1
#endif
现在你可以在命令行上说:
g++ -Wall -Wextra -o MyCpp MyCpp.cpp -DDEBUG=5
# ^^^^^^^^^
命令行参数-DFOO=bar
与将#define FOO bar
放入源代码具有相同的效果;你需要#ifndef
守卫来避免非法重新定义宏。
有时人们会使用辅助宏阻止定义另一个宏:
#ifndef SUPPRESS_FOO
# define FOO
#endif
// ... later
#ifdef FOO
// ...
#endif
现在在代码中说-DSUPPRESS_FOO
到不定义FOO
...
答案 1 :(得分:1)
当我通过命令行运行程序时,如何更改布尔宏的值?
目前,你不能。您正在使用预处理程序符号,因此决定是否应打印调试信息是编译时决定。您将不得不将编译时DEBUG符号更改为通过解析命令行,通过在运行时读入的某个配置文件或两者来设置的运行时变量。
解析命令行并不难。有很多低级C风格的工具可以帮助你做到这一点。 Boost有一个更强大的基于C ++的方案。然后,技巧是将那些编译时调试决策更改为运行时决策。最简单的说,并不难:只需用全局变量替换DEBUG预处理器符号即可。当然,你可以比这更复杂。最终,您将拥有可配置的日志记录系统。 Boost也有。
答案 2 :(得分:0)
请注意以下事项。如果您有c / cpp文件或其中一个包含的头文件:
#define DEBUG 1
然后您无法使用编译器的命令行(makefile)修改此定义。根本没有机会。 cpp文件只会覆盖命令行设置。