12

私はこれを持っています:

#if sizeof(int)
    #error Can't use sizeof in a #if
#endif

このコンパイラエラーが発生します:

missing binary operator before token "("

ここでsizeof演算子を使用できないのはなぜですか?

4

4 に答える 4

12

sizeof()はプリプロセッサの実行後に計算されるため、の情報は利用できません#if

Cコンパイラは、ほとんどの最新のコンパイラがそれらを分離していなくても、論理的に2つのフェーズに分割されます。まず、ソースが前処理されます。これには、すべてのプリプロセッサ条件(#if、#define、定義された単語をそれらの置換に置き換える)を計算して置換することが含まれます。次に、ソースはコンパイラー自体に渡され、処理されます。プリプロセッサはCの構造を最小限しか認識せず、型の知識がないため、sizeof()のようなコンパイラレベルの構造を処理できません。

于 2010-02-23T15:53:54.667 に答える
1

プリプロセッサディレクティブではリテラル定数しか使用できないためです。その上、sizeof(int)は常に0より大きいので、とにかくこの#ifは常に当てはまると思います。

于 2010-02-23T15:53:37.857 に答える
-3

検討:

#if sizeof(MyClass) > 3
   #define MY_CONSTRAINT 2
#endif

class MyClass
{
   #if MY_CONSTRAINT == 3
      int myMember = 3;
   #endif
};

さて、これは私が最後にC ++を行ってからしばらく経っているので、正しい構文で書かれていませんが、要点はまだ残っています:)

于 2010-02-23T15:57:25.703 に答える
-3

通常のif-elseを使用するだけです

if      (sizeof(x)==2)  {...}
else if (sizeof(x)==4)  {...}
else                    {...}

コンパイラはコンパイル時に最適化します...

于 2013-02-28T14:02:10.827 に答える