offsetof
|
ヘッダーで定義
<stddef.h>
|
||
|
#define offsetof(type, member) /*implementation-defined*/
|
||
マクロ offsetof は 整数定数式 に展開され、その型は size_t です。値は、指定された型のオブジェクトの先頭から、その指定された部分オブジェクトまでのバイト単位のオフセットであり、パディングがある場合はそれを含みます。
静的ストレージ期間を持つ
type
型のオブジェクト
o
が与えられた場合、
&
(
o.
member
)
はアドレス定数式であり、
o
の部分オブジェクトを指さなければならない。それ以外の場合、動作は未定義である。
|
|
(C23以降) |
目次 |
注記
offsetof
がビットフィールドメンバーに適用された場合、ビットフィールドのアドレスを取得できないため、動作は未定義となります。
member
は直接のメンバーに限定されません。配列メンバーの要素など、特定のメンバーのサブオブジェクトを表すこともできます。
C23でカンマが括弧で囲まれていない新しい型を
offsetof
で指定することは未定義動作と規定されていますが、このような使用法は通常、以前のモードでもサポートされていません:
offsetof
(
struct
Foo
{
int
a, b
;
}
, a
)
は一般的にコンパイルに失敗します。
|
typeof は、新しい型の定義におけるカンマの悪影響を回避するために使用できます。例えば、 offsetof ( typeof ( struct { int i, j ; } ) , i ) は適切に定義されます。 |
(C23以降) |
例
出力例:
the first element is at offset 0 the double is at offset 8
不具合報告
以下の動作変更に関する不具合報告は、以前に公開されたC規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| DR 496 | C89 | 構造体と構造体メンバーのみが言及されていた | 共用体とその他の部分オブジェクトもサポートされる |
関連項目
|
sizeof
演算子によって返される符号なし整数型
(typedef) |
|
|
C++ documentation
for
offsetof
|
|