Dlaczego ten kod się kompiluje?
_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, "");
Pierwsze 2 potwierdzenia są oczywiście poprawne, ale spodziewałbym się, że ostatni wiersz zakończy się niepowodzeniem, ponieważ rozumiem, że sizeof()
powinien być przeliczany na literał całkowity, którego nie można traktować jako tablicy. Innymi słowy, zakończy się niepowodzeniem w taki sam sposób, jak następująca linia:
_Static_assert(4[0] == 4, "");
Co ciekawe, poniższe rzeczy rzeczywiście nie dają się skompilować (co powinno robić to samo, nie?):
_Static_assert(*sizeof(my_arr) == 4, "");
błąd: niepoprawny argument typu jednoargumentowego „*” (ma „long unsigned int”) _Static_assert (* sizeof (my_arr) == 4, „”);
Jeśli to ma znaczenie, używam gcc 5.3.0
( sizeof( my_arr ) )[ 0 ]
zawodzi.