-E
вывод официально не указан в стандарте. Это инженерный компромисс между несколькими различными ограничениями дизайна, из которых соответствующие два являются:
- пробелы должны быть вставлены или удалены по мере необходимости так, что «собственно компилятор» (представьте себе подачу
-E
выход обратно в gcc -fpreprocessed
- который что -save-temps
делает) видит ту же последовательность pp-tokens, что это обычно (без -E
). (См. Раздел 6.4 раздела 6.4 для определения pp-токена.)
- в максимально возможной степени, токены должны отображаться в той же строке и позиции столбца, что и в исходном исходном коде, чтобы сообщения об ошибках и информация об отладке насколько это возможно.
Вот как это относится к вашим примерам:
ret\
urn 0;
обратной косой перевод строки объединяет ret
и urn
в один рр-токенов, которые поэтому должны появиться все вместе на одной линии на выходе. Тем не менее, 0
и ;
должны оставаться в исходной строке и столбце, чтобы диагностика была точной. Таким образом, вы получите
return
0;
с пробелами вставленных держать 0
в своей первоначальной колонке.
ret\
urn 0;
Здесь обратная косая-перевод строки сразу следует пробел, так ret
и urn
сделать не должны быть объединены, так что, опять же, диагностика наиболее точным, если все остается там, где оно первоначально было, и выход
ret
urn 0;
, который выглядит как обратная косая черта-новая линия, не имела никакого эффекта.
Вы можете найти вывод gcc -E -P
менее удивительным. -P
сообщает препроцессору не беспокоить попытку сохранить позицию маркера (а также отключает все эти строки, начинающиеся с вывода #
). Ваши примеры производят return 0;
и ret urn 0;
, причем все в одной строке, в режиме -P
.
Наконец, совет: каждый, кто когда-либо читать ваш код (и который включает в себя шесть месяцев спустя) будет признателен, если вы не никогда разделить маркер в середине с обратной косой черты, символ новой строки, очень за исключением длинными строковыми литералами. Это устаревшая ошибка, которая не была бы включена в язык, если бы она была разработана с нуля сегодня.
В чем вопрос? –
Где код, воспроизводивший вашу проблему? –
нет необходимости в коде. Я не забочусь о выполнении кода, я говорю о фазе препроцессора !!! – Sabrina