2

私はいくつかのautoconfのものを扱っています、そして以下を含むテストがあります:

static int test_array [1 - 2 * !((((float)((int)((float)1.4))) == ((float)1.4)) >= 0)];

これは次の場合に失敗します。

エラー:「test_array」のストレージサイズが一定ではありません

しかし、これを次のように変更すると:

static int test_array [1 - 2 * !((((int)((int)((int)1.4))) == ((int)1.4)) >= 0)];

それはうまくいきます。

私はautotoolsが採用しているすべてのハックに精通しているわけではありませんが、どちらもコンパイル時に値を決定できるはずです。

なぜ最初のものが失敗するのですか?

4

1 に答える 1

6

標準(6.6(6))を見てみましょう:

整数定数式は整数型であり、整数定数であるオペランド、列挙定数、文字定数、sizeof 結果が整数定数である式、_Alignof式、およびキャストの直接のオペランドである浮動定数のみを持つものとします。整数定数式のキャスト演算子はsizeof、 or演算子のオペランドの一部を除いて、算術型を整数型にのみ変換するものとし_Alignofます。

(私の強調)。

float整数定数式でキャストしてはいけません(sizeofまたはへの引数を除く_Alignof)。

1 - 2 * !((((float)((int)((float)1.4))) == ((float)1.4)) >= 0)

整数定数式ではありません。

配列の要素数はstatic、正の整数に評価される整数定数式である必要があります。

于 2013-01-07T16:46:43.597 に答える