临时禁用调试代码

时间:2014-12-05 15:00:31

标签: c++ visual-c++ compiler-warnings readability

我习惯使用这样的代码来调试那些写起来不是很容易的块:

if(0) 
{ 
    // debugging code 
}

问题是"warning C4127: conditional expression is constant"

我正在保留对旧代码的评论,这些代码可以在将来的任何时候删除(但应保留一段时间,以便有可能遵循原作者的意图)。我可以使用“#if 0”,但我没有看到可读性有任何改善,相反(但这可能是一个品味问题)。

哪个更友好,更具可读性,无警告解决方案?

(因为这更像是关于风格的问题,也许有更好的StackExchange地方)

编辑调试代码不等同于调试配置(_DEBUG):通常在_DEBUG内,但我不想污染它,所以我必须用{{1}禁用它}

4 个答案:

答案 0 :(得分:5)

使用预处理器:

#if 0 
    // Deactivated code.
#endif

您也可以定义宏DEBUG(或您选择的名称),然后执行类似

的操作
#ifdef DEBUG 
    // Debug code.
#endif

注意:我建议使用您自己的宏而不是现有的宏(如_DEBUG或NDEBUG,请参阅_DEBUG vs NDEBUG)。

答案 1 :(得分:3)

您可以使用逗号运算符(http://en.wikipedia.org/wiki/Comma_operator):

if (0,0) {
  // ...
}

在VS2013下,它会在最高警告级别

下删除此警告

[编辑]

在我的代码中,我有时会使用以下习语:

#if defined(_DEBUG)
    static bool bVerbose = false;
    if ( bVerbose ) {
       // do some debugging code, like print to log some data structure etc.
    }
#endif

然后当我单步执行代码并且我发现需要更多调查的地方时我将调试器中的bVerbose更改为true并且我可以看到它的输出等。这样我就不必重建项目以启用调试代码,并且还尝试重现问题。更改执行点在这里也非常有用。

答案 2 :(得分:1)

我喜欢这样做:

bool test = false;
if ( test )
{
   ...
}

这样做的另一个好处是我可以在if语句上设置断点,并在应用程序运行时更改test的值以启用或禁用调试代码。

答案 3 :(得分:0)

拿这个!定义并调用lamda函数

缺点:

  • 仅限C ++ 11

  • 常量,但编译器没有得到它(至少是g ++)
  • 单线
  • 其他范围内无状态
  • 直观且易于记忆;)

测试代码

#include <iostream>

#define ON ([] () { return true; }())
#define OFF ([] () { return false; }())

int main()
{
    if (ON)
    {
        std::cout << "Block 1" << std::endl;
    }

    if (OFF)
    {
        std::cout << "Block 2" << std::endl;
    }

    return 0;
}

编辑:首先使用正确的宏可能会非常方便。见上文。