2012-09-24 173 views
0

当我通过命令行运行程序时,如何更改布尔宏的值?举例来说,假设我有下面的宏在我的cpp文件,称它为MyCpp.cppC++命令行调试参数

#define DEBUG 1 

我怎样才能改变这个当我运行我的程序?通过命令行:

g++ -Wall -Wextra -o MyCpp MyCpp.cpp 

我很确定你指定某种类型的命令行选项,这是否响铃? 另外,我不想使用argv[]

+0

请注意'MyCpp.cpp'必须是我见过的最糟糕的文件名之一。我敢打赌,它包含'class Class'和'struct struct_',可能是从'void myfunction()'调用的。 –

+1

不,它包含'MyClass'和'MyStruct',它们是'Cpp.cpp'中'Class'和'Struct'的封装。:) – abarnert

+0

是否要在*编译*时间或*执行*时间更改值? – Joe

回答

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

你输入得太快。至少这次,我在完成之前看到了它。 –

+0

这是否给我的宏的价值5? – CodeKingPlusPlus

+0

@CodeKingPlusPlus:正确,它的确如此。 –

1

当我通过命令行运行程序时,如何更改布尔宏的值?

就目前而言,你不能。您正在使用预处理器符号,因此决定是否打印调试信息是编译时决定。您将不得不将该编译时DEBUG符号更改为通过解析命令行设置的运行时变量,通过在运行时读入的一些配置文件或两者兼而有之。

解析命令行并不困难。有很多低级C风格的工具可以帮助你做到这一点。 Boost具有更强大的基于C++的方案。诀窍在于将这些编译时调试决策更改为运行时决策。最简单的方法并不难:只需用全局变量替换该DEBUG预处理器符号即可。当然,你可以比这更复杂一点。最终你会有一个可配置的日志记录系统。 Boost也有。

+0

这回答OP所问的问题,而不是OP可能想要的东西。无论是这个还是Kerrek SB的答案都可能是对的,但我不确定哪个,所以对两者都+1。 – abarnert

0

请注意以下几点。如果你在你的C/CPP文件或您的包含的头文件中的一个具有:

#define DEBUG 1 

那么你就不能使用编译器(生成文件)的命令行修改这个定义。根本没有机会。 cpp文件将简单覆盖命令行设置。