2

マクロでプリプロセッサディレクティブを使用しようとしていますか?これはどのように達成できますか?

#define     HTTP_REQUEST_RETURN_ERROR(error)    *errCode = error;
                                                 #ifdef DEBUG
                                                        LeaveCriticalSection(&debugOutputLock);
                                                 #endif
                                                 return NULL

よろしくお願いします、ジョリ。

4

3 に答える 3

7

もちろん、異なる定義でマクロを2回定義することもできます。

#if defined DEBUG
#define HTTP_REQUEST_RETURN_ERROR(error) do { *errCode = error;\
                                          LeaveCriticalSection(&debugOutputLock);\
                                          return NULL;\
                                         } while(0)
#else
#define HTTP_REQUEST_RETURN_ERROR(error) do { *errCode = error;\
                                           return NULL;\
                                         } while(0)
#endif

ifこれにより、xdazzが使用した(自明に最適化可能な)ランタイムを回避できます。また、マクロ本体を典型的なものでラップしてdo ... while、ステートメントのように見せます。

更新:明確にするために、Cのマルチステートメントマクロはdo ... while(0)、テキスト全体を1つのステートメントにするため、(マクロ定義で)ループでラップされることがよくあります。これにより、マクロの使用法がスコープとセミコロンでうまく機能するようになります。

たとえば、次のことを考慮してください。

if(httpRequestFailed())
  HTTP_REQUEST_RETURN_ERROR(404);
else
  processResults();

がないと、とのdo ... while(0)間に複数のステートメントが存在するため、上記は構文エラーになります。上記のようなステートメントのような望ましい使用法では、マクロ展開に中括弧を追加するだけでは、あまりクリーンではありません。ifelse

if(httpRequestFailed())
  { ... /* code omitted */ };

これはあまりきれいではありませんが、コードスコープに続く中括弧の後には通常セミコロンが続きません。

于 2012-08-24T09:48:50.080 に答える
4

プリプロセッサディレクティブをにネストすることはできません#define

于 2012-08-24T09:32:59.670 に答える
0

DEBUG通常のifステートメントを定義して使用します。

#define DEBUG 0

#define HTTP_REQUEST_RETURN_ERROR(error)  *errCode = error;
                                          if (DEBUG) LeaveCriticalSection(&debugOutputLock);
                                          return NULL
于 2012-08-24T09:36:19.047 に答える