C++相談室 part166 (783レス)
C++相談室 part166 http://mevius.5ch.net/test/read.cgi/tech/1745631298/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
必死チェッカー(本家)
(べ)
自ID
レス栞
あぼーん
770: デフォルトの名無しさん (ワッチョイ ffa1-txSl) [sage] 2025/12/13(土) 08:54:58.15 ID:WPESu7ut0 LF <--> CR LF 変換はI/Oの段階で行われるものだという印象 証拠に、"\r\n" をテキストモードでファイルに書くと "\r\r\n" になり、 それをテキストモードで読むと "\r\n" に戻るのは万国共通のふるまいのはず(適当 (バイナリモードだともちろん文字列リテラルとファイルのデータ両方 "\r\n"。 すなわちC/C++言語における文字列リテラルの改行は古来より "\n" の1文字…… なので >従来はそうだったはずだけど C++23 からは Unicode (UTF-8) のコードポイントの並びで規定されていて、 CRLF が単一の改行に置き換えられる規則が明記されてる。 こそ >(ソースコード上の生文字リテラル内での行の折り返しを)「改行が入力された場合、改行の制御文字 '\n' に変換される」 ことの根拠になっているのでは…… で、 >Unicode 系以外の文字コードから処理系定義の規則で Unicode に適当にマッピングするようなのも認めているので というのは "\r\n" <--> "\n" の変換(文字数が違う)を正当化しないと思う http://mevius.5ch.net/test/read.cgi/tech/1745631298/770
771: デフォルトの名無しさん (ワッチョイ ffa1-txSl) [sage] 2025/12/13(土) 09:19:18.23 ID:WPESu7ut0 >>763 のは次のような特殊なケースでのみ問題になるだけなのではないかという希ガス #define TEXT_DEFINITION R"(begin\ a,\ b,\ c\ end)" std::string text = TEXT_DEFINITION; // textの内容が "(begin\na\nb\nc\nend)" になることを気体 初期段階、と書かれるとようわからんが、行を結合するのはプリプロセッサが行うだけのはず…… C/C++は文脈自由言語でありかつ改行文字はトークンでないから、パーサー部分が行を結合する必然性が無い http://mevius.5ch.net/test/read.cgi/tech/1745631298/771
773: デフォルトの名無しさん (ワッチョイ ffa1-txSl) [sage] 2025/12/13(土) 10:26:05.41 ID:WPESu7ut0 >>772 >\r\nと\r\r\nの変換が万国共通ということは別にないはず >>770 の前段のは、 C/C++のバイナリモードとテキストモードのI/Oの挙動がC/C++言語の文字列リテラル内の改行が "\n" 一文字であることを含意しているという主旨、 なので、あくまでC/C++のI/Oの挙動において\r\nと\r\r\nの変換が万国共通ならおk、 >ソースコードをコンパイルする前処理としての改行コードの正規化(?)の話 Windowsのメモ帳で R"(begin a)" と書いたらソースファイル上は beginとaの間に CR LF が入るが文字列リテラルの期待値は "begin\na" ですよ(CR LF → LF 1文字に変換)、という話のはず…… http://mevius.5ch.net/test/read.cgi/tech/1745631298/773
778: デフォルトの名無しさん (ワッチョイ ffa1-txSl) [sage] 2025/12/13(土) 18:42:47.60 ID:WPESu7ut0 >>775 ↓これがどのプラットフォームのエディタで書いてビルドしてもequality 1 2がtrueになるのなら ソースコードの改行(CR LF or LF)が「"\n" に変換されている」としか言いようがないような…… std::string text1 = R"(begin a, b, c end)"; // "\n" を含まない文字列定義 std::string text2 = "begin\na,\nb,\nc\nend"; // "\n" を含む文字列定義 std::cout << std::boolalpha << "equality 1 2: " << (text1 == text2) << std::endl; んまー説明のための新しい改行表現を定義したいなら止めはしませぬが…… http://mevius.5ch.net/test/read.cgi/tech/1745631298/778
779: デフォルトの名無しさん (ワッチョイ ffa1-txSl) [sage] 2025/12/13(土) 18:53:55.47 ID:WPESu7ut0 それはそうとしてRAW文字列とプリプロセッサとの関係で試したら(漏れにとって)奇怪なことがわかりた…… ↓次のコードがビルドが通ってequality 2 5 がtrueになる…… // プリプロセッサを通す場合(3) // マクロ定義が複数行に渡る場合、本来は \\ で行継続せねばならないが、RAW stringの行継続は特別視 #define TEXT_DEFINITION R"(begin a, b, c end)" std::string text5 = TEXT_DEFINITION; std::cout << text5 << std::endl; std::cout << std::boolalpha << "equality 2 5: " << (text2 == text5) << std::endl; これはさすがにプリプロセスの段階でプリプロセッサが R"(...)" を認識しないとできない芸当…… (プリプロセッサの普通の挙動ならTEXT_DEFINITION の定義内容は R"(begin(ここで日記は終わってゐる にならねばおかしいはず ソ〜ス: https://ideone.com/AJcmZT http://mevius.5ch.net/test/read.cgi/tech/1745631298/779
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.761s*