Почему этот код компилируется?
_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, "");
Первые два утверждения, очевидно, правильны, но я ожидал, что последняя строка не сработает, поскольку я понимаю, что sizeof()
должен оценивать целочисленный литерал, который нельзя рассматривать как массив. Другими словами, он потерпел бы неудачу так же, как и следующая строка:
_Static_assert(4[0] == 4, "");
Интересно, что следующее действительно не удается скомпилировать (что должно делать то же самое, нет?):
_Static_assert(*sizeof(my_arr) == 4, "");
error: недопустимый аргумент типа унарного '*' (есть "long unsigned int" ) _Static_assert (* sizeof (my_arr) == 4, "");
Если это важно, я использую gcc 5.3.0