In C99 haben wir zusammengesetzte Literale, die an Funktionen wie in übergeben werden können:
f((int[2]){ 1, 2 });
Wenn jedoch f
keine Funktion, sondern ein funktionsähnliches Makro ist, scheitert der Gcc daran, weil der Präprozessor es nicht als ein Argument, sondern als zwei Argumente parst, " (int[2]){ 1
" und " 2 }
".
Ist dies ein Fehler in gcc oder in der C-Norm? Wenn es das letztere ist, schließt das so ziemlich jede transparente Verwendung von funktionsähnlichen Makros aus, was ein großer Fehler zu sein scheint...
Editar: Als Beispiel würde man erwarten, dass das folgende Programmfragment konform ist:
fgetc((FILE *[2]){ f1, f2 }[i]);
Da aber fgetc
als Makro implementiert werden könnte (auch wenn es erforderlich wäre, sein Argument zu schützen und es nicht mehr als einmal auszuwerten), wäre dieser Code tatsächlich falsch. Das scheint mir überraschend zu sein.