sizeof を使ったコンパイル時チェック
ふーむ。
#define wchar_t int /* do something */ #undef wchar_t /* do something */
とかそういうケースかなぁ。
単にコンパイル時にチェックしたいのなら、C++ の場合適当に boost の concept_check もどき作ればいけそうだなぁ、とか思った。boost 使えるなら static_assert で終了な気もするけど。
template<bool b> class check { public: check() { check_failed(); } }; template< class check<true> { public: check() { } }; int main() { check<sizeof(wchar_t) == sizeof(int)>(); }
とかそういうの。
C の場合は
#include <wchar.h> #if defined(NDEBUG) # define CHECK_SIZEOF_WCHAR_T #else # define CHECK_SIZEOF_WCHAR_T do { \ int a[sizeof(wchar_t) == sizeof(int) ? 1 : -1]; \ (void) a; \ } while (0); #endif int main() { CHECK_SIZEOF_WCHAR_T; return 0; }
とかそういうのを思いついた。荒業。
追記
これは compile time assert に他ならないんだから、汎用化したほうが良いな。実際使うかどうかは別にして。
#if defined(NDEBUG) # define STATIC_ASSERT #else # define STATIC_ASSERT(x) do { \ int a[(x) ? 1 : -1]; \ (void) a; \ } while (0); #endif #define CHECK_SIZEOF_WCHAR_T STATIC_ASSERT(sizeof(wchar_t) == sizeof(int)) int main() { CHECK_SIZEOF_WCHAR_T; return; }
で、なんか検索したら comp.lang.c の議論が出てきた。
面白い。