Когда сращивание строк CPP отменяется в необработанных строках C++0x, требуется ли соответствующая реализация для сохранения исходной последовательности новой строки?

В последнем черновике C++0x, n3126, говорится:

Каждый экземпляр символа обратной косой черты (\), за которым непосредственно следует символ новой строки, удаляется, объединяя физические исходные строки в логические исходные строки.

...

В пределах r-char-sequence необработанного строкового литерала все преобразования, выполненные на этапах 1 и 2 (триграфы, универсальные имена символов и объединение строк), отменяются.

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

Потребуются ли соответствующие реализации C++0x для сохранения последовательности новой строки, которая сразу следует за символом обратной косой черты \ в последовательности r-char необработанной строки? Может быть, лучше спросить: можно ли ожидать, что компилятор Windows C++0x будет отменять соединение каждой строки с помощью "\\\r\n" вместо "\\\n"?


person Daniel Trebbien    schedule 27.12.2010    source источник
comment
Что именно вы делаете, что вам нужно знать об этом?   -  person Karl Knechtel    schedule 27.12.2010
comment
@Karl: это было бы важно, например, в переносимом коде, который использует сращивание строк в строковых литералах, тогда разрывы строк каким-то образом меняются на собственный стиль, когда код перемещается на новую платформу (например, потому что некоторые текстовые редакторы не обрабатывают внешние разрывы строк Что ж). В этом конкретном случае возникает вопрос: гарантирует ли стандарт значение строкового литерала, и если да, то что? Конечно, это не то же самое, что знать - можно было бы не использовать эту функцию, а не искать разъяснения по стандарту.   -  person Steve Jessop    schedule 27.12.2010
comment
@Karl: В дополнение к замечанию Стива о возможном получении другого строкового литерала, я работаю над проектом, который включает сканирование необработанных строковых литералов. Это было то, о чем я задавался вопросом.   -  person Daniel Trebbien    schedule 27.12.2010


Ответы (2)


Фаза перевода 1 начинается с

Символы физического исходного файла сопоставляются способом, определяемым реализацией, с базовым исходным набором символов (с введением символов новой строки для индикаторов конца строки), если это необходимо. Последовательности триграфов (2.3) заменяются [...]

Я бы интерпретировал требование «любые преобразования, выполненные на этапах 1 и 2 (триграфы, универсальные имена символов и объединение строк)» как явный не возврат преобразования из символов исходного файла в базовый исходный код. набор символов. Вместо этого исходные символы позже преобразуются в набор символов выполнения, и вы получаете там символы новой строки.

person Martin v. Löwis    schedule 27.12.2010

Если вам нужна определенная последовательность окончания строки, вы можете вставить ее явно и использовать конкатенацию строковых литералов:

char* nitpicky = "I must have a \\r\\n line ending!\r\n"
"Otherwise, some other piece of code will misinterpret this line!";
person Karl Knechtel    schedule 27.12.2010