Может (или может) подавить макрос замены в C, заключая в скобки имя

Кажется, я помню, что можно было бы подавить замену (расширение) макроса на C, поместив имя макроса в скобки, например. (free)(p) будет вызывать функцию free независимо от того, был ли задан макрос free. Я не вижу упоминания об этом в стандарте C99 (он есть, см. Ответ), и я замечаю, что MSVS 2013 не реализует его либо. Добавлено в свете ответа: это так, как требуется стандарту, т.е. Только для макросов функций, расширение которых запускается следующим образом ( и, таким образом, задерживается промежуточным ").

Я мечтаю, или была такая возможность, и если да, то в чем причина ее снятия? Или присутствовал только на определенных диалектах?

Ответ 1

Функциональный макрос FOO

#define FOO(x) ...

расширяется только тогда, когда появляется токен FOO, за которым следует токен (. Таким образом, чтобы предотвратить расширение FOO, можно использовать (FOO). Как вы сказали. Это, однако, относится только к функциональным макросам.

Это указано в ISO 9899: 2011 §6.10.3 ¶10, в котором говорится:

10 Директива предварительной обработки формы

# определить идентификатор lparen identifier-list opt) new-line для замены-списка
   # определить идентификатор lparen ...) new-line замены-списка
   # определить идентификатор lparen identifier-list ,...) new-line-список заметок

определяет функционально-подобный макрос с параметрами, использование которых аналогично синтаксическому вызову функции. Параметры указаны по необязательному списку идентификаторов, объем которых простирается от их в списке идентификаторов до символа новой строки, который завершает директиву #define препроцессора. Каждый последующий экземпляр функционально-подобного имени макроса, за которым следует ( как следующий токен предварительной обработки вводит последовательность токенов предварительной обработки который заменяется списком замещения в определении ( вызов макроса). Заменяемая последовательность предварительной обработки токены заканчиваются с помощью соответствующего ) токена предварительной обработки, пропускающего интерполяция согласованных пар левой и правой скобок жетоны. В пределах последовательности токенов предварительной обработки, составляющих вызывание функционально-подобного макроса, новая строка считается нормальной белый пробел.