最終更新日時(UTC):
が更新

履歴 編集

参照するPOSIX規格を更新(C++23)

概要

C++20まではPOSIX規格としてISO/IEC 9945:2003 (別名POSIX.1-2001 aka The Single UNIX Specification, version 3) を参照していた。

しかし、標準C++の一部の機能はより新しいPOSIX規格の機能を使用していたため、ISO/IEC 9945:2003への参照を削除した上で、以下の3つの規格を参照するよう変更する:

  1. ISO/IEC/IEEE 9945:20032009, Information Technology — Portable Operating System Interface (POSIX)
  2. ISO/IEC/IEEE 9945:2009/Cor 1:2013, Information Technology — Portable Operating System Interface (POSIX), Technical Corrigendum 1
  3. ISO/IEC/IEEE 9945:2009/Cor 2:2017, Information Technology — Portable Operating System Interface (POSIX), Technical Corrigendum 2

posix名前空間の予約に関してのPOSIX規格の参照もまた、ISO/IEC 9945からISO/IEC/IEEE 9945に変更する。

また、POSIXの一部環境で非推奨となっている機能であるreaddir_r()を参照していたところを、readdir()に置き換える。

この機能が必要になった背景・経緯

ここでは、具体的に問題になった、標準C++が参照するPOSIXの機能を列挙する。

errno

C++03まで、<cerrno><errno.h>にはISO Cが要求するEDOM (定義域エラー)、ERANGE (値域エラー)、errnoといった必要最低限のマクロのみが含まれていた。

C++11での<system_error>ライブラリの導入にともなって、「<cerrno>で定義される内容は、errnoがマクロ定義されることを除いてPOSIXの<errno.h>ヘッダと同じである」という規定となった。この規定のあとにマクロのリストが定義されるが、ENOTRECOVERABLEEOWNERDEADはPOSIXの2006規格、ENOTSUPEOPNOTSUPPは2008規格で追加されたものだった。

POSIXの2008年では標準C++で定義されるマクロのほかにEDQUOTEMULTIHOPENOLINKといった具体的な意味をもたない「予約済み」というだけのマクロももっている。すでに定義されているESTALEのようにそれらを標準C++に追加することは今後検討する必要はあるが、ここでは提案しない。

ファイルシステム

pathクラスについて、POSIX.1-2008の4.12 Pathname ResolutionとPOSIX.1-2017の4.13 Pathname Resolutionを追加で参照する必要がある。

ここで参照するほとんどの機能はPOSIX.1-2001に存在するが、ファイルの最終更新日時のfutimens()関数、ファイル権限のfchmodat()関数は存在していない。

truncate()statvfs()の機能はオプションであり、POSIXに準拠する環境に存在する必要がない。POSIX.1-2008ではこれらの機能がオプションではなくなった。

stat()で使用されるS_ISVTXマクロはオプション機能であり、XSIの一部である。これはPOSIX.1-2008とPOSIX.1-2017でもオプションのままである。

POSIX.1-2001のスレッドセーフ関数 (Thread-Safe Functions : TSF) オプションの一部であるreaddir_r()を参照する注記もあるが、POSIX.1-2008ではBaseに移動されている。ただし、readdir_r() APIの実装には欠陥があり、一部の実装では非推奨となっており、将来のバージョンから削除される可能性がある。ここではreaddir_r()に固有のものに依存してはいないため、readdir()を参照するよう変更する。

参照