なぜこのコードはコンパイルするのですか?
_Static uint32_t my_arr[2];
_Static_assert(sizeof(my_arr) == 8, "");
_Static_assert(sizeof(my_arr[0]) == 4, "");
_Static_assert(sizeof(my_arr)[0] == 4, "");
最初の2つのアサートは明らかに正しいですがsizeof()
、配列として処理できない整数リテラルに評価する必要があることを理解しているため、最後の行が失敗することを期待していました。つまり、次の行が失敗するのと同じ方法で失敗します。
_Static_assert(4[0] == 4, "");
興味深いことに、以下は実際にコンパイルに失敗します(同じことをする必要がありますか?):
_Static_assert(*sizeof(my_arr) == 4, "");
エラー:単項 '*'の型引数が無効です( 'long unsigned int'があります)_Static_assert(* sizeof(my_arr)== 4、 "");
それが重要であれば、私はgcc 5.3.0を使用しています
( sizeof( my_arr ) )[ 0 ]
失敗すると思います。