如何在没有花括号的情况下检查/检测'if'子句?

时间:2013-04-05 10:25:59

标签: c++

在C / C ++代码项目中,我想找到所有不使用花括号的 if / else 句子。是否有任何编译器检查或实用程序来查找它们?

主要问题是我想重新定义一些调试宏以避免在某些条件下进行跟踪评估(是否知道任何其他解决方案?)。我需要找到它们以避免使用“dangling-else problem”

中指出的"if" block without curly braces makes subsequent "else if" nested

代码:

修改前:

DEBUG GET_DEBUG_DST(DEBUG_LEVEL_DEBUG).nospace() << DEBUG_PREFIX << __PRETTY_FUNCTION__

现在我们将使用if内部没有括号:

DEBUG if (getDebugmode(DEBUG_LEVEL_DEBUG)) GET_DEBUG_DST(DEBUG_LEVEL_DEBUG).nospace() << DEBUG_PREFIX << __PRETTY_FUNCTION__

有问题的代码示例:

if (my condition)
    DEBUG << "hi there";
else
    {some more code;}

3 个答案:

答案 0 :(得分:4)

只需反转逻辑,并将活动部分放入else中 分支:

#define DEBUG if( !getDebugmode( DEBUG_LEVEL_DEBUG ) )              \
        ;                                                           \
    else                                                            \
        GET_DEBUG_DST( DEBUG_LEVEL_DEBUG ).nospace()                \
            << DEBUG_PREFIX << __PRETTY_FUNCTION__

由于else匹配if,因此无法接听 任何额外的else

答案 1 :(得分:1)

  

我想在c / c ++代码项目中找到所有不使用花括号的if / else语句。是否有任何编译器检查或实用程序来查找它们?

这听起来像x-y problem。如果您尝试使用no-op替换DEBUG宏,该no-op不会使if的语法无效,您可以使用:

#ifdef DEBUG_ENABLED
#define DEBUG GET_DEBUG_DST(DEBUG_LEVEL_DEBUG).nospace() << DEBUG_PREFIX // ...
#else
#define DEBUG do {;} while(false); /##/
#endif

在这种情况下,DEBUG将是一个有效的操作(由于if块中没有任何内容而不会使else无效),并且同一行(调试消息数据)上的任何内容将评估为:

if (my condition)
    do {;} while(false); // << "hi there";
else
    {some more code;}

这样做的缺点是不允许多行调试注释:

if (my condition)
    DEBUG << "hi there"
        << "some more data on a different line"; // causes error if DEBUG is no-op
else
    {some more code;}

答案 2 :(得分:-1)

糟糕的主意。

使用:

#define debug(x)do {if(DEBUG_LEVEL)print_stuff(x); } while(0)

避免了这个问题。