Warum wird dieser Code kompiliert?
_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, "");
Die ersten beiden Behauptungen sind offensichtlich korrekt, aber ich hätte erwartet, dass die letzte Zeile fehlschlägt, da ich verstehe, dass dies sizeof()
zu einem ganzzahligen Literal ausgewertet werden sollte, das nicht als Array behandelt werden kann. Mit anderen Worten, es würde genauso fehlschlagen wie die folgende Zeile:
_Static_assert(4[0] == 4, "");
Interessanterweise kann das Folgende tatsächlich nicht kompiliert werden (was sollte dasselbe tun, nein?):
_Static_assert(*sizeof(my_arr) == 4, "");
Fehler: ungültiges Typargument von unary '*' (habe 'long unsigned int') _Static_assert (* sizeof (my_arr) == 4, "");
Wenn es darauf ankommt, verwende ich gcc 5.3.0
( sizeof( my_arr ) )[ 0 ]
scheitert.