# ScopedClearLastError in base baseディレクトリ読みの穴埋めをしていこうの回。 ## ScopedClearLastErrorとは何 [ScopedClearLastError](https://source.chromium.org/chromium/chromium/src/+/main:base/scoped_clear_last_error.h)は、errnoを一時的に保存しておくためのScopedオブジェクト。 やることはかんたんで、construct時にerrnoの値を`last_errno_`メンバ変数に格納して`errno`は`0`で上書きし、オブジェクト破壊時にもとの値を復元する。 ```cpp class BASE_EXPORT ScopedClearLastErrorBase { public: ScopedClearLastErrorBase() : last_errno_(errno) { errno = 0; } ~ScopedClearLastErrorBase() { errno = last_errno_; } private: const int last_errno_; }; ``` ### Windows では? 上記のクラスはWindows以外のプラットフォームで使用されている。 Windows用はScopedClearLastErrorBaseを継承した上で少し違う。 ```cpp ScopedClearLastError::ScopedClearLastError() : ScopedClearLastErrorBase(), last_system_error_(GetLastError()) { SetLastError(0); } ScopedClearLastError::~ScopedClearLastError() { SetLastError(last_system_error_); } ``` [GetLastError](https://learn.microsoft.com/ja-jp/windows/win32/api/errhandlingapi/nf-errhandlingapi-getlasterror)はWindowsプラットフォームでスレッドローカルのエラーコードを取得する。 一方ScopedClearLastErrorBaseのコンストラクタを呼んでいるのでerrnoも保存している。 errnoはCの実行時エラーなのでWindowsのエラーとは別に意味を持つ。 ## いつつかう? base::Loggingの中で[`last_error_`](https://source.chromium.org/chromium/chromium/src/+/main:base/logging.h;l=634;drc=1701fd99b91dd2ea8deb3d8744a0bbffc36d02fa)で、ログを出力する際の副作用を回避するためにerrnoを保管している。 今日はここまで。