エラー処理について質問があります。
APIを使った時のエラー処理にはGetLastError()を使い、
CRTを使った時のエラー処理にはerrnoを使っています。
これだとエラー処理が統一されてない感じなので
どっちかに統一したいですが、
果たしてGetLastErrorとerrnoが返す番号が同じかどうか不安です。
一度実験をしてみました。
remove命令を使って使用中のファイルを削除しようとした時に
GetLastErrorが返したのは32でerrnoが返したのが13でした
エラー内容は、
GetLastErrorが
「プロセスはファイルにアクセスできません。別のプロセスが使用中です。」
errnoが
「Permission denied」
でした。
番号は違うのですが、エラー内容は似ています。
どちらかというとGetLastErrorの内容の方がこのみです。
ということは、
APIにしてもCRTにしてもGetLastErrorで統一すればOKなんでしょうか?
因みに私がいってるエラー処理とは、
エラー発生
エラーNo取得
エラーNoからエラーメッセージ取得
エラーメッセージを表示
という流れのことです。
> APIにしてもCRTにしてもGetLastErrorで統一すればOKなんでしょうか?
両者は準拠仕様が異なりますので、おそらく不可能です。
CRT 終了時の GetLastError については一般的な保証があるわけではありませんので、
CRT の内部実装で最後に使われた API のエラーが単に残ると思われます。
そのあたりまで考慮して CRT の実装が行われてるかは、提供元次第だと思います。
# VCなら Microsoft に確認するとか.....他処理系には持っていけないかもしれませんが。
Windows 以外の環境を最初から考慮にいれなくてよく、API のエラー内容がお好みならば、
処理自体を全て API に統一するのがよいかと思います。
他環境での動作が必要であれば、両者を区別して扱うしかないでしょう。
# 関数化する/ラッパーを作るくらいはできるかと思いますが。
私も無理だと思います。
というか、そもそも仕様を決めているところが違いますし。
APIはWindowsの仕様なのでMicroSoftが自分達の都合で決めたものですからね。
少なくともCRTもAPIも使っていて内部のエラー処理を統一しようと言うのは
無理があると思います。
外部へのエラー体系はアプリを作成する側で決めるものですから統一も出来るでしょうけ
れど。
Banさんが言われているようにGetLastErrorから返ってくる結果やerrnoの内容を
読み替えてアプリ内で統一したエラーコードで取り扱うくらいが限界ではないでしょうか。
よくわかりました。
ありがとうござりました。