Размещают ли препроцессоры макросы в кавычках? - PullRequest
1 голос
/ 04 августа 2020

Распространяют ли распространенные препроцессоры, такие как cpp и fpp, макросы, заключенные в пару кавычек?

Я пробовал следующий код, используя как cpp, так и fpp, кажется, что макросы в кавычках не расширен. Однако я не нашел этого правила ни в одной документации о cpp или fpp. Может ли кто-нибудь направить меня к какой-либо документации, чтобы я мог быть уверен в этом поведении? Спасибо.

#define X Y
X
"X"
'X'

Ответы [ 3 ]

5 голосов
/ 04 августа 2020

Распространяют ли распространенные препроцессоры, такие как 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 выполнит расширение макроса над содержимым символьных литералов. Я не знаю ни одной реализации, которая противоречила бы моим ожиданиям в этом отношении.

3 голосов
/ 04 августа 2020

Для C (не знаю Фортрана, но может быть таким же):

Раскрывают ли процессоры макросы в кавычках?

Нет.

Макрос не будет расширен, если идентификатор макроса является частью строкового литерала ("") или символьной константы (''). Затем идентификатор / имя макроса становится частью строкового литерала / символьной константы.

"X" - Это строковый литерал символов 'X' + '\0'.

'X' - это символьная константа для буквы X.

2 голосов
/ 04 августа 2020

Другая точка зрения: препроцессор заменяет токены / идентификаторы, и это полезно для этого. Литерал (числовой или строковый) не является идентификатором, и было бы бесполезно - и очень рискованно - заменять его.

В другом ответе упоминается, что соответствующий C препроцессор не должен заменять литерал струны. Для go на один шаг дальше, я попытался скомпилировать следующую программу:

#define 12 13
#include <stdio.h>

main() {
  printf("%i\n", 12);
}

, и результат (g cc версия 8.3.0, Debian 8.3.0-6):

test.c:1:9: error: macro names must be identifiers
 #define 12 13
         ^~

Думаю, это демонстрирует, что препроцессор хочет работать с идентификаторами.

...