template
解決方法を Web で調べてたところ,http://www.rhinocerus.net/forum/language-c-moderated/563180-modern-c-design-compiletimechecker-issue.html で紹介されている方法が良さそうだったので,これを採用しました.ただし,紹介されている方法のままだと unused variable と言う warning が出るので若干修正.
template <bool> struct compile_time_checker; template <> struct compile_time_checker<true> { void check_done() {} }; #define STATIC_CHECK(expr, msg) \ if (false) { \ compile_time_checker<(expr) != 0> \ error_##msg; \ (error_##msg).check_done(); \ }
msg で指定された名前で compile_time_checker 型の変数を定義するためのマクロなのですが,compile_time_checker
int main(int argc, char* argv[]) { /* * STATIC_CHECK マクロは,第 1 の式が false になるときに, * error_##msg と言うコンパイルエラーを表示させるためのマクロ. */ STATIC_CHECK(sizeof(char) == 1, static_check_is_ok); STATIC_CHECK(sizeof(int) == 1, print_static_check_message); STATIC_CHECK(sizeof(char) == 1, static_check_is_ok); return 0; }
gcc 3.4.4 (cygwin)
$ g++ -I.. -Wall example_static_check.cpp example_static_check.cpp: In function `int main(int, char**)': example_static_check.cpp:43: error: aggregate `compile_time_checker< false> error_print_static_check_message' has incomplete type and cannot be defined
gcc 4.3.2 (cygwin)
$ g++-4 -I.. -Wall example_static_check.cpp example_static_check.cpp: In function 'int main(int, char**)': example_static_check.cpp:43: error: aggregate 'compile_time_checker<false> error_print_static_check_message' has incomplete type and cannot be defined
"error_print_static_check_message" が伝えたいエラー内容を出力する部分です.コンパイルエラー時に出力されるメッセージが期待された通りのものかどうかはコンパイラ次第なのですが,gcc と VC++ ではそれっぽい(エラーとなった理由が分かる)エラーメッセージが出力されるようです.