質問: fopen("out.txt", "w");` のようなコードは書くべきでは無い ということです。 私の解釈・意見はともかく、本家の質問者の場合は実際に変更できているわけで、 変更出来る実装だった場合、 このような使用は有効ですか?それとも無効ですか? 実際に変更できようができまいが、このような使用を試みること自体が無効? (つまり実質的にこのような代入による変更は不能 ※私の意見はこれ) 規格上このような使用は動作未定義だとされていれば無効だとはっきりしますし、 あるいは実装定義であるということなら状況により使用可能(有効)だということになるかと思いますが、 よくわからないので質問しました。
回答: いやもう質問自体の中に答えが書いてありますが、あえて蛇足するなら JIS X3010:2003 7.19 `` 7.19.1 概説 `stderr` `stdin` `stdout` は "`FILE` へのポインタ" をもつ式とする ※オイラの注釈:「式」としか書かれていない。すなわち「変更可能」であるとは明記されていない 7.19.5.4 `freopen` の注釈 (228) (228) これらのストリームを表す識別子は snip 変更可能な左辺値とは限らない なので、言語仕様書上の解釈は - 「できる」と明言されていないことは「できない」と解釈する必要があることから、 `stdout` 等を変更しようとする試みは未定義の動作である - 未定義の動作の中には「プログラマが勝手に期待している動作」が含まれる `stdout` に代入できない処理系では、コンパイルエラーになる `stdout` に代入できる処理系であって、代入を行った結果 - `stdout` のリダイレクトを行ったかの如く振る舞う (プログラマが勝手に期待した動作と同じ動作) - 何も起こらない (リダイレクトされないまま正常動作を継続) - おかしな動作をする (`stdout` に出力したらエラー発生とか) のどれが起きても「言語仕様書上は」問題ないと読む必要がありそうです。