Токены предварительной обработки: '- -' vs. '-' - PullRequest
0 голосов
/ 30 мая 2018

Почему препроцессор (GCC) создает два токена - -B вместо одного --B в следующем примере?Какова логика, что первое должно быть правильным, а не последним?

#define A -B
-A

Вывод в соответствии с gcc -E:

- -B

В конце концов, -- является допустимым операторомтак что теоретически также действительный токен.

Это специфично для препроцессора GCC или это следует из стандартов C?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Сосредоточение внимания на вставке пробелов отсутствует.

Макрос A определяется как последовательность токенов предварительной обработки - и B.

Когда компиляторанализирует фрагмент исходного кода -A, выдает 2 токена - и A.A расширяется как часть фазы предварительной обработки, и токены преобразуются в токены C: -, - и B.

Если B сам по себе определен как макрос (#define B 4), A расширится до -, -, 4, который будет проанализирован как выражение, оцениваемое в значение 4 с типом int.

gcc -Eпроизводит текст.Чтобы текст преобразовывался обратно в ту же последовательность токенов, что и исходный исходный код, необходимо вставить пробел между двумя токенами -, чтобы предотвратить синтаксический анализ -- как одного токена.

0 голосов
/ 30 мая 2018

Препроцессор работает с токенами, а не со строками.Подстановка макросов без ## не может создать новый токен, и поэтому, если выходные данные препроцессора идут в текстовый файл, а не идут прямо в компилятор, препроцессоры вставляют пробел, чтобы выходной текстовый файл можно было снова использовать в качестве ввода C без измененной семантики.

Вставка пробела, по-видимому, не входит в стандарт, но тогда стандарт описывает препроцессор как работающий с токенами и как вывод его выходных данных собственно компилятору, а не текстовый файл.

...