N2176 C17 ballot ISO/IEC 9899:2017 §7.19 Common definitions <stddef.h>:共通の定義[1].

ヘッダー <stddef.h> では、以下のマクロが定義され、以下の型が宣言されています。いくつかのマクロは他のヘッダーでも定義されていますが、それぞれのサブクラスに記載されています[1]

size_t 型編集

size_t型は、メモリー領域のオブジェクトのサイズを表すのに適した型で、配列の要素を参照する際に使用します。通常、32ビットシステムでは32ビット、64ビットシステムでは64ビットで表現されますが、必ずしもそうではありません。符号なしです[1]

この型は,POSIX のヘッダー "unistd.h" で定義されている ssize_t という名前の符号付きのバリアントを持っている実装もある。GNU C Library では、ssize_t 型は "stddef.h" で定義されており、size_t と同じファイルに存在する。

ptrdiff_t 型編集

ptrdiff_t 型は、2つのポインターを引き算した結果の符号付き整数型です[1]

2 つのポインタを減算するとき、両方とも同じ配列オブジェクトの要素、または配列オブジェクトの最後の要素を 1 つ過ぎた要素を指すものとし、結果は 2 つの配列要素の添え字の差となります。結果のサイズは実装で定義され、その型(符号付き整数型)は <stddef.h> ヘッダーで定義されている ptrdiff_t です。結果がその型のオブジェクトで表現できない場合,その動作は未定義である。言い換えると、式 P と Q がそれぞれ配列オブジェクトの i 番目と j 番目の要素を指している場合、式 (P)-(Q) は ptrdiff_t 型のオブジェクトに収まっていれば i - j という値になります。さらに、式Pが配列オブジェクトの要素または配列オブジェクトの最後の要素を1つ過ぎたところを指し、式Qが同じ配列オブジェクトの最後の要素を指している場合、式((Q)+1)-(P)は((Q)-(P))+1と同じ値を持ち、式(Q)+1が配列オブジェクトの要素を指していなくても、式Pが配列オブジェクトの最後の要素を1つ過ぎたところを指している場合には値0を持ちます[2]

オブジェクトは PTRDIFF_MAX よりも大きいかもしれません。PTRDIFF_MAX / PTRDIFF_MIN よりも大きな差がある 2 つのポインタを減算すると、未定義の動作になります[3]


max_align_t 型編集

max_align_t 型は、アライメントが最大の基本アライメントであるオブジェクトタイプのことです。

基本アラインメントとは、_Alignof (max_align_t)以下の有効なアラインメントのことである。基本的なアラインメントは、すべての保存期間のオブジェクトに対して、実装によってサポートされなければならない[4]。 以下のタイプのアラインメント要件は、基本的なアラインメントでなければならない[4]

  • すべてのatmic修飾された、または修飾されていない基本型
  • すべてのatmic修飾された、または修飾されていない列挙型
  • すべてのatmic型、修飾型、非修飾型のポインタ型
  • 要素タイプが基本的なアラインメント要件を持つすべての配列型
  • 完全なオブジェクト型として第7節 Types(型)で指定されたすべての型
  • すべての構造体または共用体型で、その要素が基本的なアラインメント要件を持つ型を持ち、その要素が基本的なアラインメントではないアラインメントを指定するアラインメント指定子を持たないもの。


wchar_t 型編集

wchar_t 型は、サポートされているロケールの中で指定された最大の拡張文字セットのすべてのメンバーの個別コードを表すことができる整数型です。 サポートされているロケールで指定されている最大の拡張文字セットのすべてのメンバーの個別コードを表すことができる整数型です。 ヌル文字はコード値 0 とします。

基本文字セットの各メンバーは、実装が__STDC_MB_MIGHT_NEQ_WC__を定義していない場合、整数の文字定数の中で単独の文字として使用されるときの値に等しいコード値を持たなければなりません。

NULL編集

処理系定義の空ポインタ定数( null pointer constant )に展開されます。 C23のプロポーザルに C++ と同様な nullptr が提案されていますが、現在の草案には含まれていません[5]

offsetof(type, member-designator)編集

offsetof(type, member-designator)

マクロ offsetof の値は、構造体の先頭(typeで指定)から構造体のメンバー(member-designatorで指定)へのバイト単位のオフセットであるsize_t型の整数定数式に展開されます。

指定された構造体 type 内の指定された member フィールドのバイトオフセットを決定するために使用される関数マクロです。

推奨事項
size_t と ptrdiff_t に使用される型は、実装が必要となるほど大きなオブジェクトをサポートしない限り、signed long int よりも大きな整数変換ランクを持つべきではありません。

脚註編集

  1. ^ 1.0 1.1 1.2 1.3 N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 211, §7.19 Common definitions <stddef.h>. オリジナルの2018-12-30時点によるアーカイブ。. https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf. 
  2. ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 66, §6.5.6 Additive operators. オリジナルの2018-12-30時点によるアーカイブ。. https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf. 
  3. ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 215, §7.20.3 Limits of other integer types. オリジナルの2018-12-30時点によるアーカイブ。. https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf. 
  4. ^ 4.0 4.1 N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 36, §6.2.8 Alignment of objects. オリジナルの2018-12-30時点によるアーカイブ。. https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf. 
  5. ^ Jens Gustedt; INRIA and ICube, Universit´e de Strasbourg, France. Introduce the nullptr constant proposal for C23. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2692.pdf. 

外部リンク編集