¿Por qué se compila este código?
_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, "");
Las primeras 2 afirmaciones son obviamente correctas, pero hubiera esperado que la última línea fallara, ya que entiendo que sizeof()
debería evaluar un literal entero, que no puede tratarse como una matriz. En otras palabras, fallaría de la misma manera que falla la siguiente línea:
_Static_assert(4[0] == 4, "");
Curiosamente, lo siguiente no puede compilarse (que debería estar haciendo lo mismo, ¿no?):
_Static_assert(*sizeof(my_arr) == 4, "");
error: argumento de tipo no válido de '*' unario (tiene 'int largo sin signo') _Static_assert (* sizeof (my_arr) == 4, "");
Si importa, estoy usando gcc 5.3.0
( sizeof( my_arr ) )[ 0 ]
falla.