もちろん、異なる定義でマクロを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)
間に複数のステートメントが存在するため、上記は構文エラーになります。上記のようなステートメントのような望ましい使用法では、マクロ展開に中括弧を追加するだけでは、あまりクリーンではありません。if
else
if(httpRequestFailed())
{ ... /* code omitted */ };
これはあまりきれいではありませんが、コードスコープに続く中括弧の後には通常セミコロンが続きません。