Ваш вопрос:
См. Ответ Жан-Франсуа Фабра.в стандарте есть странность (и я не утверждаю, что это нечто большее).
C99 7.19.1 гласит:
Заголовок объявляет три типа,несколько макросов и множество функций для ввода и вывода.
...
Макросы:
...
stderr stdin stdout
, которые являются выражениями типа "указатель на FILE", которые указывают на объекты FILE, связанные, соответственно, со стандартной ошибкой, входным и выходным потоками.
Как давно сказал Кит Томпсонназад В контексте это говорит о том, что они являются макросами, но в описании всех других макросов используется фраза «которая расширяется до».Для stderr, stdin и stdout говорится, что они являются выражениями (что, если они являются макросами, не совсем корректно).
Если им разрешено быть, скажем,, объявляя объекты, а не макросы, следует изменить 7.19.1p1, чтобы разрешить эти объявления, и описание stderr, stdin и stdout не должно быть частью длинного предложения на странице.
Более правдоподобно, если они являются обязательными для использования в качестве макросов, фразу «которые являются выражениями» следует заменить на «которые расширяют до выражений».
Они не обязательно являются макросами.Однако в вашем случае вам повезло, что макрос расширяется до выражения с защитными скобками.Чистый пример злого макроса, скрывающего фактическое содержание.