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