#define errno unspecified
概要
errno は、標準ライブラリのエラー状態を表すマクロである。
この変数は、以下の特徴を持つ:
- プログラム起動時に値
0で初期化される。
ただし、C++11 以降におけるスレッドとの関連については以下も参照のこと。 - マクロではあるが、本マクロの展開結果は
int型の変更可能な左辺値である(つまり、ユーザプロクラムにおいて代入が可能)。
ただし、本マクロの展開結果がオブジェクトの識別子とは限らない(例えば、展開結果が*errno()であるような実装が考えられる)。 - ライブラリの呼び出しでエラーが発生しなかった場合でも、
0に設定されることはない。
したがって、errnoの値でエラーの発生有無をチェックするためには、ライブラリ呼び出しの前にユーザプログラム側でerrnoを0に設定しなければならない。 - C++11 以降では、
errnoはスレッド毎に値を保持する。
この場合、プログラム起動時の初期スレッド以外の初期値は不定である。
なお、C++11 以前では規格にスレッドの概念が導入されていないため、規格上スレッドとの関連性は言及されていないが、通常の処理系では C++11 以降の規格と同様スレッド毎に値を保持する。
例
#include <iostream>
#include <cmath>
#include <cerrno>
int main()
{
std::acosh(0.1f);
if (errno == EDOM) {
std::cout << "定義域エラー" << std::endl;
}
}
出力
定義域エラー