Язык C определяется в терминах токенов , и один из токенов является строковым литералом (в стандартном варианте: s-char-sequence ). s-char-последовательности начинаются и заканчиваются неэкранированными двойными кавычками и не должны содержать неэкранированные символы новой строки.
Соответствующий стандарт (C99) цитата:
> Syntax
> string-literal:
> " s-char-sequence(opt) "
> L" s-char-sequence(opt) "
> s-char-sequence:
> s-char
> s-char-sequence s-char
> s-char:
> any member of the source character set
> except the double-quote ", backslash \,
> or new-line character
> escape-sequence
Экранированные символы новой строки, однако, удаляются на ранней стадии перевода, называемой объединением строк , поэтому компилятору никогда не удается их интерпретировать. Вот соответствующая стандартная (C99) цитата:
Приоритет среди синтаксических правил перевода определяется следующими этапами.
- Многобайтовые символы физического исходного файла отображаются, в соответствии с реализацией, в исходный набор символов (ввод символов новой строки для индикаторов конца строки), если это необходимо. Последовательности триграфа заменяются соответствующими односимвольными внутренними представлениями.
- Каждый экземпляр символа обратной косой черты (\), за которым сразу следует символ новой строки, удаляется, объединяя физические исходные строки для формирования логических исходных строк. Только последняя обратная косая черта в любой физической исходной строке имеет право на участие в таком соединении. Исходный файл, который не является пустым, должен заканчиваться символом новой строки, которому не должен предшествовать символ обратной косой черты, прежде чем произойдет любое такое соединение.
- Исходный файл разлагается на токены предварительной обработки6) и последовательности
символы пробела (включая комментарии). Исходный файл не должен заканчиваться
частичный токен предварительной обработки или частичный комментарий. Каждый комментарий заменяется
один пробел Символы новой строки сохраняются. Будь каждый непустой
последовательность символов пробела, кроме новой строки, сохраняется или заменяется одним символом пробела в зависимости от реализации.
- Выполняются директивы предварительной обработки, расширяются вызовы макросов и
_Pragma Унарные операторные выражения выполняются. Если последовательность символов, которая
соответствует синтаксису универсального имени персонажа, созданного токеном
конкатенация (6.10.3.3), поведение не определено. # Включить предварительную обработку
директива заставляет именованный заголовок или исходный файл обрабатываться с фазы 1
до фазы 4, рекурсивно. Все директивы предварительной обработки затем удаляются.
- Каждый элемент исходного набора символов и escape-последовательность в символьных константах и строковых литералах преобразуются в соответствующий элемент набора символов выполнения; если соответствующего члена нет, он преобразуется в определяемый реализацией член, отличный от нулевого (широкого) символа.7)
- Литеральные токены смежных строк объединяются.
- Пробельные символы, разделяющие токены, больше не имеют значения. каждый
Токен предварительной обработки преобразуется в токен. Полученные токены
синтаксически и семантически проанализирован и переведен как единица перевода.
- Все внешние ссылки на объекты и функции разрешены. Компоненты библиотеки связаны для удовлетворения внешних ссылок на функции и объекты, не определенные в текущем переводе. Весь такой вывод транслятора собирается в образ программы, который содержит информацию, необходимую для выполнения в среде выполнения.