私はこれを持っています:
#if sizeof(int)
#error Can't use sizeof in a #if
#endif
このコンパイラエラーが発生します:
missing binary operator before token "("
ここでsizeof演算子を使用できないのはなぜですか?
私はこれを持っています:
#if sizeof(int)
#error Can't use sizeof in a #if
#endif
このコンパイラエラーが発生します:
missing binary operator before token "("
ここでsizeof演算子を使用できないのはなぜですか?
sizeof()はプリプロセッサの実行後に計算されるため、の情報は利用できません#if
。
Cコンパイラは、ほとんどの最新のコンパイラがそれらを分離していなくても、論理的に2つのフェーズに分割されます。まず、ソースが前処理されます。これには、すべてのプリプロセッサ条件(#if、#define、定義された単語をそれらの置換に置き換える)を計算して置換することが含まれます。次に、ソースはコンパイラー自体に渡され、処理されます。プリプロセッサはCの構造を最小限しか認識せず、型の知識がないため、sizeof()のようなコンパイラレベルの構造を処理できません。
プリプロセッサディレクティブではリテラル定数しか使用できないためです。その上、sizeof(int)は常に0より大きいので、とにかくこの#ifは常に当てはまると思います。
検討:
#if sizeof(MyClass) > 3
#define MY_CONSTRAINT 2
#endif
class MyClass
{
#if MY_CONSTRAINT == 3
int myMember = 3;
#endif
};
さて、これは私が最後にC ++を行ってからしばらく経っているので、正しい構文で書かれていませんが、要点はまだ残っています:)
通常のif-elseを使用するだけです
if (sizeof(x)==2) {...}
else if (sizeof(x)==4) {...}
else {...}
コンパイラはコンパイル時に最適化します...