Возврат каретки + перевод строки в необработанных строковых литералах?

Рассмотрим файл C ++ с окончанием строки UNIX (т.е. '\x0a' вместо "\x0d\x0a") и включает следующий необработанный строковый литерал:

const char foo[] = R"(hello^M
)";

(где ^M фактический байт 0x0d (то есть возврат каретки)).

Каким должен быть результат последующего сравнения строк (с учетом стандартного определения необработанных строковых литералов)?

strcmp("hello\r\n", foo);

Должны ли строки сравниваться с равными или нет? (Т.е. 0 или же !=0 ?)

С GCC 4.8 (на Fedora 19) они сравниваются неравно.

Это ошибка или функция в GCC?

3

Решение

Что касается стандарта, вы можете использовать только членов основной исходный набор символов в строковых литералах (и в других местах программы). То, как физическое представление программы отображается на базовый исходный набор символов, определяется реализацией.

g ++, очевидно, считает, что ASCII \ x0a, ASCII \ x0d и ASCII \ x0d \ x0a — все допустимые представления члена базового исходного набора символов, называемого «новой строкой». Это вполне разумно, учитывая, что желательно, чтобы исходный код, передаваемый между компьютерами Windows, Unix и Mac OS X Classic, сохранял свое значение.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]