Tại sao mã này biên dịch?
_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 khẳng định đầu tiên rõ ràng là chính xác, nhưng tôi đã dự đoán dòng cuối cùng sẽ thất bại, vì sự hiểu biết của tôi là sizeof()
nên đánh giá theo một số nguyên, không thể được coi là một mảng. Nói cách khác, nó sẽ thất bại theo cách tương tự như dòng sau:
_Static_assert(4[0] == 4, "");
Thật thú vị, những điều sau đây thực sự không biên dịch (mà nên làm điều tương tự, phải không?):
_Static_assert(*sizeof(my_arr) == 4, "");
lỗi: đối số loại không hợp lệ của unary '*' (có 'long unsign int') _Static_assert (* sizeof (my_arr) == 4, "");
Nếu có vấn đề, tôi đang sử dụng gcc 5.3.0
( sizeof( my_arr ) )[ 0 ]
thất bại.