Фон:
В версиях Mac OS до версии 9 стандартное представление текстовых файлов использовало символ ASCII CR (символ возврата каретки), значение decimal 13, чтобы отметить конец строки.
Mac OS 10, в отличие от предыдущих выпусков, является UNIX-подобным и использует символ ASCII LF (строка), значение десятичное 10, чтобы отметить конец строки.
Вопрос: каковы значения символьных констант '\n'
и '\r'
в компиляторах C и С++ для выпусков ОС Mac до OS X?
Есть (по крайней мере) два возможных подхода, которые можно было бы предпринять:
- Относитесь к
'\n'
как символ ASCII LF и преобразуйте его в и из CR на выходе и вводе из текстовых потоков (аналогично преобразованию между LF и CR-LF в системах Windows); или - Лечить
'\n'
как символ ASCII CR, который не требует преобразования на входе или выходе.
Были бы некоторые потенциальные проблемы со вторым подходом. Один из них заключается в том, что код, который предполагает '\n'
, может быть неудачным. (В любом случае такой код по своей природе не переносится.) Другое дело, что для '\r'
все еще должно быть четкое значение, а в системе на основе ASCII CR - единственное разумное значение. И стандарт C не позволяет '\n' == '\r'
(благодаря mafso для поиска цитаты, 5.2.2 параграф 3), поэтому для '\r'
необходимо использовать другое значение.
Каков результат этой C-программы при компиляции и выполнении в Mac OS N, для N менее 10?
#include <stdio.h>
int main(void) {
printf("'\\n' = %d\n", '\n');
printf("'\\r' = %d\n", '\r');
if ('\n' == '\r') {
printf("Hmm, this could be a problem\n");
}
}
Вопрос относится как к C, так и к С++. Я предполагаю, что ответ будет одинаковым для обоих.
Ответ может также варьироваться от одного компилятора C к другому, но я надеюсь, что разработчики компилятора будут поддерживать согласованность друг с другом.
Чтобы быть ясным, я не спрашиваю, какое представление старых выпусков Mac OS используется для представления конца строки в текстовых файлах. Мой вопрос конкретно и только о значениях констант '\n'
и '\r'
в исходном коде C или С++. Я знаю, что печать '\n'
(независимо от ее значения) в текстовый поток заставляет его преобразовываться в системное представление конца строки (в данном случае ASCII CR); это поведение требуется по стандарту C.