none
エラー詳細コードの桁数はWindowsとAnsiで違うの? RRS feed

  • 質問

  • GetLastErrorが返却する詳細コード(DWORD:unsigned intと定義されている)とAnsiのerrno(int)は両方とも現在4バイトで同一桁数なのですが、属性が違うので将来桁数が違ってくる可能性が有るのでしょうか。現在の状態なら詳細コードの変数は1個で共用出来るのですが、桁数が変わるとプログラムの変更(ロジックの変更、テスト)が必要と成って来るのですが。
    2014年1月21日 8:39

回答

  • 「C言語ランタイムが提供するerrno」と
    「Win32SDKが提供するGetLastError()」
    は異なる物(意味)を返します。
    従って、一緒の物として扱うのは不適切です。
    なぜなら、同じ値がそれぞれ異なる意味を持つ可能性があるからですね。

    △また、マニュアルにある通り、GetLastError()は、スレッド毎の値ですね。
    ○(佐祐理さんの発言どおりerrnoもスレッドセーフでした。訂正します。)

    Windowsにはこの手の最新エラー取得関数がこのほかにもありますので、
    もちろんこれらも別々に扱うのが適切なアプローチとなります。

    以上を勘案すると、

    1.これらを同質なものとして扱うべきではない。

    ということになります。型が異なるかどうかより以前の、本質的な違いがあると言っても
    良いのではないでしょうか。

    2014年1月21日 9:31
  • 補足で、エラーメッセージの意味もGetLastError()の場合はFormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,...)を使いますが、errnoの場合はstrerror()を使います。共通化などできないはずです。
    更にいうとWinSockの場合はWSAGetLastError()ですね。

    # errnoもスレッドセーフな実装に置き換えられてます。

    • 回答の候補に設定 星 睦美 2014年1月23日 0:52
    • 回答としてマーク 星 睦美 2014年1月27日 2:35
    2014年1月21日 12:33

すべての返信

  • 「C言語ランタイムが提供するerrno」と
    「Win32SDKが提供するGetLastError()」
    は異なる物(意味)を返します。
    従って、一緒の物として扱うのは不適切です。
    なぜなら、同じ値がそれぞれ異なる意味を持つ可能性があるからですね。

    △また、マニュアルにある通り、GetLastError()は、スレッド毎の値ですね。
    ○(佐祐理さんの発言どおりerrnoもスレッドセーフでした。訂正します。)

    Windowsにはこの手の最新エラー取得関数がこのほかにもありますので、
    もちろんこれらも別々に扱うのが適切なアプローチとなります。

    以上を勘案すると、

    1.これらを同質なものとして扱うべきではない。

    ということになります。型が異なるかどうかより以前の、本質的な違いがあると言っても
    良いのではないでしょうか。

    2014年1月21日 9:31
  • 補足で、エラーメッセージの意味もGetLastError()の場合はFormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,...)を使いますが、errnoの場合はstrerror()を使います。共通化などできないはずです。
    更にいうとWinSockの場合はWSAGetLastError()ですね。

    # errnoもスレッドセーフな実装に置き換えられてます。

    • 回答の候補に設定 星 睦美 2014年1月23日 0:52
    • 回答としてマーク 星 睦美 2014年1月27日 2:35
    2014年1月21日 12:33