C++教科書/標準ライブラリ編/<cerrno>の章

編集

<cerrno> ヘッダー: エラー番号の取得

編集

C++標準ライブラリには、<cerrno> ヘッダーが用意されており、POSIX 規格に準拠したエラー番号を扱うためのマクロが定義されています。この章では、<cerrno> ヘッダーの使い方と、定義されているエラー番号について説明します。

概要

編集

<cerrno> ヘッダーは、POSIX 規格の <errno.h> ヘッダーとほぼ同じ内容ですが、errno マクロの定義方法が異なります。C++ では errno をマクロとして定義することで、名前空間汚染を防いでいます。

また、POSIX 規格との相違点として、スレッドごとに個別の errno 値が保持されます。つまり、あるスレッドで発生したエラーは、別のスレッドに影響を与えません。

これは、C17のスレッドストレージに配置された errno に同等です。

ヘッダー <cerrno> の内容

編集

<cerrno> ヘッダーには、さまざまなエラー状態に対応するマクロが定義されています。以下は、代表的なマクロの一覧の一部です。

  • errno: システムコールやライブラリ関数がエラーを返した場合に設定される整数値のエラー番号が格納されます。
  • E2BIG: 引数が大きすぎる
  • EACCES: アクセス許可エラー
  • EADDRINUSE: アドレスが使用中
  • EADDRNOTAVAIL: アドレスが利用できない
  • EAFNOSUPPORT: アドレスファミリがサポートされていない
  • EAGAIN: リソースが一時的に利用できない (非同期 I/O で利用)
  • EALREADY: 操作がすでに進行中
  • EBADF: ファイル記述子 (file descriptor) が不正
  • ...(省略)

注意: 上記は定義されているマクロのごく一部です。残りのマクロについては、マニュアルや規格書を参照してください。

各マクロの意味は POSIX 規格によって定められており、<cerrno> ヘッダーでは単に名前が定義されているだけです。具体的なエラー内容を確認するには、POSIX 規格のマニュアルを参照する必要があります。

<cerrno> ヘッダーの利用例

編集

以下は、<cerrno> ヘッダーを利用する例です。

C++
#include <cerrno>  // errno
#include <cstdio>  // std::fopen() std::fclose()
#include <cstring> // std::strerror()
#include <iostream>

auto main() -> int {
    // ファイルを開こうとする
    FILE* fp = std::fopen("myfile.txt", "r");

    // エラーが発生した場合
    if (fp == nullptr) {
        if (errno == ENOENT) {
            // ファイルが存在しない
            std::cerr << "ファイルが存在しません: " << strerror(errno)
                      << std::endl;
        } else {
            // その他のエラー
            std::cerr << "ファイルを開けませんでした: " << strerror(errno)
                      << std::endl;
        }
    } else {
        // ファイルを開いた処理
        std::fclose(fp);
    }

    return 0;
}

この例では、std::fopen() 関数が失敗した場合に、errno 変数を確認してエラー内容を出力しています。

<cerrno> ヘッダーは、C++ でエラー処理を行う際に欠かせないヘッダーです。エラーコードの意味を理解し、適切に利用することで、プログラムの信頼性と保守性を向上させることができます。