Почему этот код компилируется?
_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 ]
не так.