C ++:为程序使用调试变量时的范围问题

时间:2014-10-10 08:17:07

标签: c++ debugging scope global-variables

我正在编写一个程序,我想轻松打开/关闭我的调试代码。这个程序不是生产水平 - 它是一个编程竞赛。

我只有一个文件main.cpp,所以我认为调试变量可能是可以接受的。我考虑使用全局变量,如下所示:

bool DEBUG = true;

int main()
{

    if (DEBUG)
    {
         // print debug statements and other debug code
    }
    // rest of program...

但是,我收到一条警告,表示我的DEBUG变量从未使用,if (DEBUG)总是评估为false。或者,我可以将DEBUG变量放在main()方法中:

int main()
{
    bool DEBUG = true;
    if (DEBUG)
    {
         // print debug statements and other debug code
    }
    // rest of program...

但是后来我得到一个编译器警告'Condition is always true . Any suggestions on how to easily switch on/off my DEBUG`代码?对编译器问题的解释会很棒。

2 个答案:

答案 0 :(得分:1)

常用方法是使用预处理器

#ifndef NDEBUG
// debug code
#endif

// or

#ifdef DEBUG
// debug code
#endif

虽然我在NDEBUG上工作过的一个项目是undef&d;并且被另一个项目取代,所以请检查它是否存在。

我也不会惊讶你的警告是因为还存在#define DEBUG。所以从不使用你的变量DEBUG。

通常DEBUG和NDEBUG由编译器定义。

答案 1 :(得分:0)

  

[...]我想轻松打开/关闭我的调试代码[...]有关如何轻松打开/关闭myDEBUG代码的任何建议吗?

考虑一下:

bool debug = false; // set default value on compilation
int main(int argc, char **argv)
{
    using std::literals::string_literals;

    std::vector<std::string> args{ argv, argv + argc };
    if(std::end(args) != std::find(std::begin(args), std::end(args), "-d"s))
        debug = true; // reset debug flag based on runtime parameter
    // use debug from this point onwards
}

用法:

$ ./your-app # run with compiled flag
$ ./your-app -d # run with debug information

注意:

  • "-d"s构造需要using std::literals::string_literals;
  • 您可以根据编译宏设置默认调试标志(DEBUG,_DEBUG和NDEBUG是Windows上最常见的)
  • 如果您想要更复杂的参数处理,请考虑使用boost::program-options