【问题标题】:C++ command line debug argumentC++ 命令行调试参数
【发布时间】:2012-09-16 10:48:01
【问题描述】:

当我通过命令行运行我的程序时,如何更改布尔宏的值?例如,假设我的 cpp 文件中有以下宏,将其命名为 MyCpp.cpp

#define DEBUG 1

当我运行我的程序时如何改变它?通过命令行:

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

我很确定你指定了某种命令行选项,这会响铃吗? 另外,我不想使用argv[]

【问题讨论】:

  • 请注意,MyCpp.cpp 一定是我见过的最糟糕的文件名之一。我敢打赌它包含一个class Class 和一个struct struct_,可能是从void myfunction() 调用的。
  • 不,它包含MyClassMyStruct,它们是ClassStructCpp.cpp 中的包装。 :)
  • 您要在编译时还是执行时更改值?

标签: c++ c debugging command-line


【解决方案1】:

请注意以下事项。如果您有 c/cpp 文件或包含的头文件之一:

#define DEBUG 1

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 这回答了 OP 提出的问题,而不是 OP 可能想要的问题。这个或 Kerrek SB 的答案可能是正确的,但我不确定哪个,所以对两者都 +1。
    【解决方案3】:

    首先,更改您的源代码:

    #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...

    【讨论】:

    • 您输入得太快了。至少这一次,我还没写完就看到了。
    • 这是否让我的宏的值为 5?
    • 这实际上不会在您每次通过命令行运行应用程序时更改值,而是每次您构建应用程序时.我认为后者是 OP 真正想要的,但前者是问题的介绍性句子所说的……
    • @abarnert:确实如此,但我从宏的使用中收集到 OP 是在可修改的编译时间值之后......如果不是,请她澄清!
    • 是的,正如我所说,我认为后者是 OP 真正想要的……但为了以防万一,我还给了大卫哈门一个 +1,他给出了另一个答案。