Notice : 内容無保証。禁無断転載。リンク不自由。

main.cpp

// 目標
//   コンパイル時定数 exp が、
//     0 のとき     : コンパイルエラー
//     0 以外のとき : 実行時コスト0 (= コンパイル後のコードに現れない)
//   ような、StaticAssert(exp) を作る。
//   [追加条件]
//   exp が コンパイル時に決まらない変数の場合もコンパイルエラーとなること。

// 上記目標が決まったので、目標にとって本質的でない isLittleEndianCPU()
// には一旦退場願う。

#define    StaticAssert(exp)   (void)(exp)

// ↑この定義を目標に合うように修正してゆく。

int main(void){
    StaticAssert(1) ;   // コンパイルを通ること
    StaticAssert(2) ;   // コンパイルを通ること

    StaticAssert(0) ;   // コンパイルエラーとなること

    int i = 1 ;
    StaticAssert(i) ;   // コンパイルエラーとなること

    return 0 ;
}