今回はboost.preprocessorを使おうとしたときに生じた疑問についてです。
このサイトhttp://d.hatena.ne.jp/DigitalGhost/20111205/1323052916を見て、これは便利だと思い、実際にBOOST_PP_VARIADIC_TO_ARRAYを使おうとしたのですが、
未定義だと言われてしまいます。そこでソースを見てみたところ(見づらいのでプリプロセッサの#は除いてあります)、
if BOOST_PP_VARIADICS//0と定義されていた
if BOOST_PP_VARIADICS_MSVC
define BOOST_PP_VARIADIC_TO_ARRAY(...) BOOST_PP_TUPLE_TO_ARRAY_2(BOOST_PP_VARIADIC_SIZE(__VA_ARGS__),(__VA_ARGS__))
else
define BOOST_PP_VARIADIC_TO_ARRAY(...) BOOST_PP_TUPLE_TO_ARRAY((__VA_ARGS__))
endif
endif
しかし今使っているVC++では可変長マクロに対応しているはずであり、なんか変だな、と思ってBOOST_PP_VARIADICSの定義まで見に行ったところ
if !defined BOOST_PP_VARIADICS
/* variadic support explicitly disabled for all untested compilers */
if defined __GCCXML__ || defined __CUDACC__ || defined __PATHSCALE__ ...//以下略
define BOOST_PP_VARIADICS 0
/* VC++ (C/C++) */
elif defined _MSC_VER && _MSC_VER >= 1400 && !defined __EDG__//問題の一文、__EDG__は1
if _MSC_VER >= 1400
define BOOST_PP_VARIADICS 1
define BOOST_PP_VARIADICS_MSVC 1
else
define BOOST_PP_VARIADICS 0
endif
/*中略*/
else
define BOOST_PP_VARIADICS 0//結局ここに行き着く
endif
しかし、同じ(VC++のバージョンが2005以降の)コンパイラでも、この条件文で可変長マクロの機能が使えたり使えなくなったりするのは妙なことだと思いました。
さらに、直後に同じような条件文、if _MSC_VER >= 1400を続けているのも意味が判りません。
これが解決しないと全く先へ進めないというわけでもないのですが、どのようなことか教えていただきたいです。