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