6

重複の可能性:
C /C++マクロのDo-Whileおよびif-elseステートメント

gcc (GCC) 4.7.2
c89

こんにちは、

私は次の関数のようなマクロを持っていますが、複数の行で使用する場合の推奨される使用法は何ですか?中括弧を使用するか、do..while(0)ループを使用することをお勧めします。

通常、私はすべてにdo..while(0)を使用します。しかし、中かっこだけを使用するプロジェクトを見たことがあり、どちらが良いかわかりません。

一方を行います

#define DSO_ERROR(msg, res_handle_module, mem_pool, size)   do {        \
        char *dso_error = apr_palloc((apr_pool_t*)mem_pool, size);      \
        apr_dso_error((apr_dso_handle_t*)res_handle_module, (char*)dso_error, (apr_size_t)size); \
        LOG_ERR("%s dso error %s", (char*)msg, dso_error);              \
        goto dso_failure;                                               \
    } while(0); 

中括弧

#define DSO_ERROR(msg, res_handle_module, mem_pool, size) {             \
        char *dso_error = apr_palloc((apr_pool_t*)mem_pool, size);      \
        apr_dso_error((apr_dso_handle_t*)res_handle_module, (char*)dso_error, (apr_size_t)size); \
        LOG_ERR("%s dso error %s", (char*)msg, dso_error);              \
        goto dso_failure;                                               \
    }

唯一の違いは、セミコロンが中括弧ではなくdo..whileループにプリセットされることです。

提案をありがとう、

4

3 に答える 3

8

中括弧バージョンは、次のように使用法を中断します。

if( foo )
  DSO_ERROR("Foo occured!", my_module, the_pool, 4711);
else
  printf("All is well, there is no foo\n");

これが構成のまさに理由ですdo ... while(0)。ですから、それは避ける価値があるようです。

于 2012-12-07T09:20:16.780 に答える
4

you will have a problem with this code:

if (one) 
  DSO_ERROR("one", ...);
else
  DSO_ERROR("two", ...);

so if you use the do-while-Macro WITHOUT the semicolon, you would be fine.

于 2012-12-07T09:21:51.653 に答える
2

通常、マクロのにはセミコロンがありません。do { ... } while (0)

マクロを使用する理由do { ... } while (0)は、ソースでマクロを使用して、余分な空のステートメントがなくてもセミコロンを追加できるためです。多くの場合、空のステートメント(つまり、ステートメントのないセミコロン)を使用しても何も起こらないため、これは主に歴史的な理由によるものです。

于 2012-12-07T09:15:31.047 に答える