Mengapa kode ini dikompilasi?
_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 menegaskan pertama jelas benar, tetapi saya akan berharap baris terakhir gagal, karena pemahaman saya adalah yang sizeof()
harus mengevaluasi ke literer integer, yang tidak dapat diperlakukan sebagai array. Dengan kata lain, itu akan gagal dengan cara yang sama seperti baris berikut gagal:
_Static_assert(4[0] == 4, "");
Menariknya, yang berikut ini memang gagal dikompilasi (yang seharusnya melakukan hal yang sama, bukan?):
_Static_assert(*sizeof(my_arr) == 4, "");
galat: argumen tipe tidak valid dari '*' unary (memiliki 'int unsigned lama') _Static_assert (* sizeof (my_arr) == 4, "");
Jika itu penting, saya menggunakan gcc 5.3.0
( sizeof( my_arr ) )[ 0 ]
gagal.