Рассмотрим файл 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?
Что касается стандарта, вы можете использовать только членов основной исходный набор символов в строковых литералах (и в других местах программы). То, как физическое представление программы отображается на базовый исходный набор символов, определяется реализацией.
g ++, очевидно, считает, что ASCII \ x0a, ASCII \ x0d и ASCII \ x0d \ x0a — все допустимые представления члена базового исходного набора символов, называемого «новой строкой». Это вполне разумно, учитывая, что желательно, чтобы исходный код, передаваемый между компьютерами Windows, Unix и Mac OS X Classic, сохранял свое значение.
Других решений пока нет …