2

C/C++ コード プロジェクトで、中かっこを使用していないすべてのif/else文を検索したいと考えています。それらを見つけるためのコンパイラチェックまたはユーティリティはありますか?

主な問題は、いくつかのデバッグ マクロを再定義して、いくつかの条件でトレースの評価を回避したいことです (他の解決策はありますか?)。そして、中括弧なしの「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

1

中括弧を使用していないすべての if/else 文を ac/c++ コード プロジェクトで見つけたいと思います。それらを見つけるためのコンパイラチェックまたはユーティリティはありますか?

これはxy 問題のように聞こえます。DEBUG マクロを、if の構文を無効にしない no-op に置き換えようとしている場合は、次を使用できます。

#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 に答える