通过命令行运行程序时,如何更改布尔宏的值?例如,假设我的 cpp 文件中有以下宏,将其命名为 MyCpp.cpp
#define DEBUG 1
运行程序时如何更改此设置?通过命令行:
g++ -Wall -Wextra -o MyCpp MyCpp.cpp
我很确定您指定了某种命令行选项,这会响铃吗?另外,我不想使用argv[]
通过命令行运行程序时,如何更改布尔宏的值?例如,假设我的 cpp 文件中有以下宏,将其命名为 MyCpp.cpp
#define DEBUG 1
运行程序时如何更改此设置?通过命令行:
g++ -Wall -Wextra -o MyCpp MyCpp.cpp
我很确定您指定了某种命令行选项,这会响铃吗?另外,我不想使用argv[]
首先,更改您的源代码:
#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
通过命令行运行程序时,如何更改布尔宏的值?
就目前而言,你不能。您正在使用预处理器符号,因此是否应打印调试信息的决定是编译时决定。您将不得不将该编译时调试符号更改为您通过解析命令行设置的运行时变量,通过在运行时读取的一些配置文件,或两者兼而有之。
解析命令行并不难。有很多低级 C 风格的工具可以帮助您做到这一点。Boost 有一个更强大的基于 C++ 的方案。诀窍是将那些编译时调试决策更改为运行时决策。在最简单的情况下,这并不难:只需将那个 DEBUG 预处理器符号替换为一个全局变量。当然,你可以得到比这更复杂的东西。最终,您将拥有一个可配置的日志记录系统。Boost也有。
请注意以下事项。如果您的 c/cpp 文件或包含的头文件之一中有:
#define DEBUG 1
那么你不能使用编译器的命令行(makefile)修改这个定义。根本没有机会。cpp 文件将简单地覆盖命令行设置。