2

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

主要问题是我想重新定义一些调试宏以避免在某些情况下进行跟踪评估(有人知道其他解决方案吗?)。而且我需要找到它们以避免“悬空-else问题”</a>,正如“if”块中所指出的那样,没有花括号会使后续的“else if”嵌套

代码片段:

修改前:

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;}
4

3 回答 3

4

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

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

由于 有 的匹配项elseif因此它无法获取任何额外else的 。

于 2013-04-05T10:44:45.600 回答
1

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

这听起来像xy 问题。如果您尝试使用不会使 if 语法无效的空操作替换 DEBUG 宏,则可以使用:

#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;}
于 2013-04-05T10:36:40.600 回答
-1

馊主意。

采用:

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

这避免了这个问题。

于 2013-04-05T10:29:52.690 回答