В C99 у нас есть составные литералы, и они могут быть переданы в функции как в:
f((int[2]){ 1, 2 });
Однако, если f
не является функцией, а скорее похожим на функцию макросом, gcc преобразует это из-за того, что препроцессор анализирует его не как один аргумент, а как два аргумента: "(int[2]){ 1
" и "2 }
».
Это ошибка в gcc или в стандарте C? Если это последнее, то это в значительной степени исключает прозрачное использование функционально-подобных макросов, что кажется огромным недостатком ...
Редактировать: В качестве примера можно ожидать, что следующий фрагмент программы будет соответствовать:
fgetc((FILE *[2]){ f1, f2 }[i]);
Но поскольку fgetc
может быть реализован в виде макроса (хотя и необходим для защиты своего аргумента, а не для его оценки более одного раза), этот код на самом деле будет некорректным. Это кажется мне удивительным.