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 の議論が出てきた。

面白い。