マクロ関数の引数内でカンマを使用する
下記のようにマクロ関数内でテンプレート等を書く場合にカンマを使用すると、式が評価される前に引数として扱われるのでエラーになります。
#define STATIC_ASSERT(expr) static_assert(expr, #expr) // error: too many arguments provided to function-like macro invocation STATIC_ASSERT(std::is_same<int, int>::value); // ...( (std::is_same<int), (int>::value) ) のように評価される // 回避するためには式を括弧でくくる STATIC_ASSERT( (std::is_same<int, int>::value) );
これ、エラー気づかないでたまにハマることが多くて、括弧を記述するのも地味に手間だったんですが、 可変長マクロで回避出来そうなのでやってみました。
[ソース]
#include <type_traits> #define STATIC_ASSERT_IMPL(expr) static_assert(expr, #expr) #define STATIC_ASSERT(...) STATIC_ASSERT_IMPL((__VA_ARGS__)) // ok STATIC_ASSERT(std::is_same<int, int>::value);
簡単なマクロ関数だとこれでも問題ないかな?
引数が複数の場合には使えませんが…。