Распространяют ли распространенные препроцессоры, такие как cpp и fpp, макросы, заключенные в пару кавычек?
Спецификация языка C описывает поведение соответствующих препроцессоров C. Действующие стандарты для C не доступны в свободном доступе, но вы можете получить копии поздних черновиков. Для C18, например, вы можете обратиться к N2176 . В частности, вам следует взглянуть на разделы 5.1.1.2 и 6.10.3. Особое значение имеет сноска 173 в разделе 6.10.3:
Поскольку к моменту замены макроса все символьные константы и строковые литералы являются токенами предварительной обработки, а не последовательностями, которые могут содержать подпоследовательности, подобные идентификаторам (см. 5.1 .1.2, фазы перевода), они никогда не сканируются на предмет имен или параметров макросов.
(Практически такой же текст появляется и в более ранних версиях стандарта.)
Внизу Строка для C, значит, это no , соответствующий C препроцессор не выполняет замену макросов для содержимого строковых литералов или символьных констант.
Ситуация для Фортрана менее ясна, потому что спецификация языка Фортран не определяет средства предварительной обработки. В сам язык встроен оператор include
, но специалисты по Фортрану обычно не рассматривают его использование для включения предварительной обработки. Исходный код Fortran редко полагается на функции предварительной обработки, такие как расширение макросов или условная компиляция.
Некоторые реализации Fortran, тем не менее, предоставляют средство предварительной обработки, иногда доступное как отдельная программа с именем fpp
. Вам нужно будет проконсультироваться с документацией вашего спецификационного c fpp
для деталей, но обычно это адаптации препроцессора C к синтаксису Fortran. Таким образом, no , я бы не ожидал, что препроцессор Fortran выполнит расширение макроса над содержимым символьных литералов. Я не знаю ни одной реализации, которая противоречила бы моим ожиданиям в этом отношении.