バックグラウンド:
Mac OS のバージョン 9 までのバージョンでは、テキスト ファイルの標準表現は、ASCII CR (キャリッジ リターン) 文字、値 10 進数 13 を使用して行の終わりを示していました。
Mac OS 10 は、以前のリリースとは異なり、UNIX に似ており、ASCII LF (改行) 文字、値 10 進数 10 を使用して行の終わりをマークします。
問題は、文字定数の値と、OS X より前の Mac OS リリースの C および C++ コンパイラの値は何'\n'
ですか'\r'
?
取ることができた可能性のある(少なくとも)2つの可能なアプローチがあります。
- ASCII LF 文字として扱い
'\n'
、テキスト ストリームへの出力およびテキスト ストリームからの入力で CR との間で変換します (Windows システムでの LF と CR-LF 間の変換と同様)。また '\n'
入力または出力で変換を必要としない ASCII CR 文字として扱います。
2 番目のアプローチには、潜在的な問題がいくつかあります。'\n'
1 つは、 LFであると想定するコードが失敗する可能性があることです。(このようなコードは本質的に移植性がありません。) もう 1 つは、 には別個の値が必要であり'\r'
、ASCII ベースのシステムでは CR が唯一の適切な値であるということです。また、C 標準では許可されていないため'\n' == '\r'
(5.2.2 段落 3 の引用を見つけてくれた mafso に感謝します)、他の値を に使用する必要があります'\r'
。
Nが 10 未満の場合、Mac OS Nでコンパイルして実行すると、この C プログラムの出力はどうなりますか?
#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++ の両方に当てはまります。答えはどちらも同じだと思います。
答えは C コンパイラによっても異なる可能性がありますが、コンパイラの実装者が互いに一貫性を維持していることを願っています。
明確にするために、Mac OS の古いリリースがテキスト ファイルの行末を表すために使用していた表現を尋ねているわけではありません。私の質問は、定数の値と'\n'
C'\r'
または C++ ソース コードについてのみです。'\n'
テキスト ストリームに出力すると (その値が何であれ)、システムの行末表現 (この場合は ASCII CR) に変換されることは承知しています。その動作は C 標準で必要です。