Составные литералы и макросы, похожие на функции: ошибка в gcc или стандарте C?

В C99 у нас есть составные литералы, и их можно передавать функциям, как в:

f((int[2]){ 1, 2 });

Однако, если f не функция, а скорее функционально-подобный макрос, gcc barfs реагирует на это из-за того, что препроцессор анализирует его не как один аргумент, а как два аргумента, " (int [2] ) {1 "и" 2} ".

Это ошибка в gcc или в стандарте C? Если последнее, то это в значительной степени исключает любое прозрачное использование функционально-подобных макросов, что кажется огромным дефектом ...

Изменить: В качестве примера можно было бы ожидать, что следующая программа будет соответствующей фрагмент:

fgetc((FILE *[2]){ f1, f2 }[i]);

Но поскольку fgetc может быть реализован как макрос (хотя и требуется для защиты своего аргумента и не вычислять его более одного раза), этот код на самом деле будет неверным. Мне это кажется удивительным.

8
задан Brian Tompsett - 汤莱恩 10 March 2016 в 12:10
поделиться