当我通过命令行运行程序时,如何更改布尔宏的值?举例来说,假设我有下面的宏在我的cpp文件,称它为MyCpp.cppC++命令行调试参数
#define DEBUG 1
我怎样才能改变这个当我运行我的程序?通过命令行:
g++ -Wall -Wextra -o MyCpp MyCpp.cpp
我很确定你指定某种类型的命令行选项,这是否响铃? 另外,我不想使用argv[]
当我通过命令行运行程序时,如何更改布尔宏的值?举例来说,假设我有下面的宏在我的cpp文件,称它为MyCpp.cppC++命令行调试参数
#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
...
当我通过命令行运行程序时,如何更改布尔宏的值?
就目前而言,你不能。您正在使用预处理器符号,因此决定是否打印调试信息是编译时决定。您将不得不将该编译时DEBUG符号更改为通过解析命令行设置的运行时变量,通过在运行时读入的一些配置文件或两者兼而有之。
解析命令行并不困难。有很多低级C风格的工具可以帮助你做到这一点。 Boost具有更强大的基于C++的方案。诀窍在于将这些编译时调试决策更改为运行时决策。最简单的方法并不难:只需用全局变量替换该DEBUG预处理器符号即可。当然,你可以比这更复杂一点。最终你会有一个可配置的日志记录系统。 Boost也有。
这回答OP所问的问题,而不是OP可能想要的东西。无论是这个还是Kerrek SB的答案都可能是对的,但我不确定哪个,所以对两者都+1。 – abarnert
请注意以下几点。如果你在你的C/CPP文件或您的包含的头文件中的一个具有:
#define DEBUG 1
那么你就不能使用编译器(生成文件)的命令行修改这个定义。根本没有机会。 cpp文件将简单覆盖命令行设置。
请注意'MyCpp.cpp'必须是我见过的最糟糕的文件名之一。我敢打赌,它包含'class Class'和'struct struct_',可能是从'void myfunction()'调用的。 –
不,它包含'MyClass'和'MyStruct',它们是'Cpp.cpp'中'Class'和'Struct'的封装。:) – abarnert
是否要在*编译*时间或*执行*时间更改值? – Joe