Oracle® Developer Studio 12.5: C ユーザーズガイド

印刷ビューの終了

更新: 2016 年 7 月
 
 

7.7 標準ヘッダーと予約名

ISO 規格委員会は標準化作業の初期の段階において、ライブラリ関数、マクロ、およびヘッダーファイルを ISO C の一部として含むことを選択しました。

このセクションでは、さまざまな予約名のカテゴリとその予約名が必要な基本的な理由を示します。最後には、プログラムで予約名を使用しないようにするための規則を示します。

7.7.1 標準ヘッダー

標準ヘッダーは、assert.h、 ctype.h、 errno.h、 float.h、 limits.h、 locale.h、 math.h、 setjmp.h、 signal.h、 stdarg.h、 stddef.h、 stdio.h、 stdlib.h、 string.h、 time.h です。

ほとんどの実装は、さらに多くのヘッダーを提供しています。しかし、1990 ISO/IEC C に厳密に準拠するプログラムが使用できるヘッダーは、記載されたものだけです。

これらヘッダーの一部の内容については、ほかの規格ではわずかに異なります。たとえば、POSIX (IEEE 1003.1) は、fdopenstdio.h で宣言するように指定しています。これら 2 つの規格が共存するために、POSIX では、このような追加の名前が存在することを保証するためには任意のヘッダーをインクルードする前にマクロ _POSIX_SOURCE#defined で定義しなければならないと規定しています。また、『X/Open Portability Guide』でも、その拡張のためにこのマクロ方式を使用しています。X/Open のマクロは _XOPEN_SOURCE です。

ISO C は、標準ヘッダーがそれ自身だけで完結し、べき等 (何度指定しても同じ) であることを要求しています。どの標準ヘッダーも、その前後でほかのヘッダーを #included でインクルードする必要はありません。標準ヘッダーは何度 #included でインクルードしても、問題は発生しません。ISO C 規格では、安全なコンテキストにおいてのみ、標準ヘッダーを #included でインクルードすることを要求します。したがって、ヘッダーで使用される名前は変更されないことが保証されます。

7.7.2 実装で使用される予約名

ISO C 規格は、そのライブラリに関する実装に対して、より多くの制限を課しています。過去において、ほとんどのプログラマは UNIX システムでは独自の関数に readwrite などの名前を使用しないようにしていました。ISO C は、規格で予約されている名前だけが実装内の参照で導入されることを要求しています。

したがって規格では、実装で使用する可能性があるすべての名前のサブセットが予約されています。この名前のクラスは下線で始まり、もう 1 つの下線または大文字の英字が続く識別子から構成されます。この名前のクラスは、次の正規表現に一致するすべての名前を含みます。

_[_A-Z][0-9_a-zA-Z]*

厳密には、プログラムがこのような識別子を使用する場合、その動作は未定義です。したがって、_POSIX_SOURCE (または、_XOPEN_SOURCE) を使用するプログラムの動作は未定義です。

ただし、未定義の動作は程度の問題です。POSIX 準拠の実装で _POSIX_SOURCE を使用する場合、プログラムの未定義の動作は特定のヘッダー内に追加された特定の名前から構成されていても、受け入れられる標準にプログラムは準拠しています。ISO C 規格におけるこの故意の抜け道により、実装は外見上互換性のない仕様に準拠できます。一方、POSIX 規格に準拠しない実装は、_POSIX_SOURCE などの名前に遭遇したとき、任意の方法で動作できます。

規格では、下線で始まるほかのすべての名前が (局所的なスコープではなく) ヘッダーファイルにおける通常のファイルのスコープの識別子として、および構造体と共用体のタグとして使用するために予約されています。従来通り、_filbuf_doprnt という名前の関数によりライブラリの隠れた部分を実装することはできます。

7.7.3 拡張用の予約名

明示的に予約されたすべての名前に加えて、1990 ISO/IEC C 規格は、次の特定のパターンに一致する名前も実装用および将来の規格用として予約しています。

表 18  拡張用の予約名
ファイル
予約名のパターン
errno.h
E[0-9A-Z].*
ctype.h
(to|is)[a-z].*
locale.h
LC_[A-Z].*
math.h
現在の関数名[fl]
signal.h
(SIG|SIG_)[A-Z].*
stdlib.h
str[a-z].*
string.h
(str|mem|wcs)[a-z].*

このリストにおいて、大文字の英字で始まる名前はマクロで、関連するヘッダーがインクルードされるときだけ予約されます。残りの名前は関数を示し、大域的なオブジェクトや関数を指定する場合には使用できません。

7.7.4 安全に使用できる名前

ISO C の予約名と衝突しないようにするために従うことのできる 4 つの簡単な規則です。

  • すべてのシステムヘッダーは、ユーザーのソースファイルの最初に #include でインクルードする (_POSIX_SOURCE または _XOPEN_SOURCE あるいはその両方の #define 行がある場合は、そのあとでインクルードする)。

  • 下線で始まる名前は定義または宣言しない。

  • すべてのファイルスコープのタグと通常名の最初の数文字では、下線または大文字の英字を使用する。stdarg.h または varargs.h 内の va_ 接頭辞に注意する。

  • すべてのマクロ名の最初の数文字では、数字または小文字の英字を使用する。errno.h#included でインクルードする場合、E で始まるほとんどすべての名前は予約されています。

ほとんどの実装はデフォルトで標準ヘッダーに名前を追加しているため、これらの規則は一般的なガイドラインに過ぎません。