- cstddef[meta header]
- macro[meta id-type]
#define offsetof(type, member) integer-constant-expression- integer-constant-expression[italic]
このマクロ関数は、構造体型 type のメンバ member へのオフセット値をバイト数で返す。
この構造体の先頭から member へのバイト数が、size_t 型の符号なし整数値で返される。
C++ での構造体の機能的拡張のため、offsetof の利用は、C++11以降はスタンダードレイアウトのクラス型に制限され、C++11より以前はC の構造体のコンセプトに対応する POD のクラス型に制限される(但し、public な非仮想メンバ関数のみを持ち、コンストラクタ及びデストラクタを持たない非派生クラスも POD である)。
スタンダードレイアウトではないクラス型においてのoffsetofの利用は条件付きのサポートとなる(C++17より以前は未定義動作)。
type:memberを有効なメンバ指示子とするクラス型member: クラスtypeのメンバ指示子
type 中の member へのオフセット値を示す size_t 型の値
投げない。
C++11から、このマクロの展開結果をnoexcept演算子に渡したnoexcept(offsetof(type, member))はtrueとなることが規定されている。
#include <cstdio>
#include <cstddef>
struct mystruct {
char singlechar;
char arraymember[10];
char anotherchar;
};
int main ()
{
std::printf("offsetof(mystruct,singlechar) is %zu\n", offsetof(mystruct,singlechar));
std::printf("offsetof(mystruct,arraymember) is %zu\n", offsetof(mystruct,arraymember));
std::printf("offsetof(mystruct,anotherchar) is %zu\n", offsetof(mystruct,anotherchar));
}- offsetof[color ff0000]
offsetof(mystruct,singlechar) is 0
offsetof(mystruct,arraymember) is 1
offsetof(mystruct,anotherchar) is 11
- LWG Issue 1363. offsetof should be marked
noexcept- C++11で、このマクロが例外を送出せず、
noexcept(offsetof(type, member-designator))がtrueとなることが規定された
- C++11で、このマクロが例外を送出せず、
- LWG Issue 2709.
offsetofis unnecessarily imprecise- C++17で、標準レイアウトでないクラス型に対する
offsetofの利用が「未定義動作」から「条件付きサポート」に変更された
- C++17で、標準レイアウトでないクラス型に対する