VisualStudio 2005 では __VA_ARGS__ が使える!

むかしBREWの開発をしているとき、VisualStudioで__VA_ARGS__(可変長マクロ)が使えなくていろいろと苦労した思い出がありました。

最近、ひさびさにBREWの開発案件を担当し、しばらくは vim + 実機 だけで開発をしていました。
が、今日ふと思い立って 作っていたソースを VisualStudio 2005 でコンパイルしてみると・・・
なんと __VA_ARGS__ がふつうにコンパイルとおるじゃないですかっ!!

例えばですが、以下のようなDBGPRINTFのプチ改造が #ifdef とか使わなくても VisualStudio でも ARM でも同じコードで動く ようになりました。
__VA_ARGS__ つかってるのは最後のほうの1行だけですが。
※VisualStudio 2003 以前ではコンパイルエラーになります。

#ifdef	__DBGPRINTF
#undef	__DBGPRINTF
#endif

/// 元のDBGPRINTFを再定義
/// ついでにBrewLoggerでDBGPRINTFの出力の色を変える
/// このあたりはmizopさんから教えてもらった
#define ___DBGPRINTF GET_HELPER()->dbgprintf(DBGPRINTF_EX_FORMAT,DBGPRINTF_LEVEL_HIGH,__FILE__,__LINE__),GET_HELPER()->dbgprintf

/// BrewLoggerで長いデバッグ文も最後まで出力されるように・・・
#define __DBGPRINTF(...) \
{ \
    char szDbgPrint[1024] = {0}; \
    SNPRINTF(szDbgPrint, sizeof(szDbgPrint), __VA_ARGS__); \
    for(uint32 si=0; si < STRLEN(szDbgPrint); si+=39){ ___DBGPRINTF(szDbgPrint + si); } \
}

#ifdef DBGPRINTF
#undef DBGPRINTF
#endif

/// コンパイルオプションでデバッグ文を簡単に削除できるように・・・
/// これをしとかないとリリース時のモジュールサイズが無駄にでかくなってしまう
#ifdef _DBG_PRINT
	#define DBGPRINTF(...)   __DBGPRINTF(__VA_ARGS__)
#else
    #define DBGPRINTF(...)
#endif