|
マクロ offsetof() は構造体の先頭からメンバへのオフセットを与えます。 // 指定位置にある構造体のメンバを参照する #define atoffset( type, ptr, offset ) ( *(type *)( (char *)(ptr) + (offset) ) )
//
static const struct
{
const char *name; // メンバの名前
int offset; // メンバへのオフセット
}
g_membername[] =
{
#define _( name ) { #name, offsetof( struct tm, name ) }
_( tm_year ),
_( tm_mon ),
_( tm_mday ),
_( tm_hour ),
_( tm_min ),
_( tm_sec ),
_( tm_wday ),
_( tm_yday ),
_( tm_isdst ),
#undef _ // #define _( name )
};
//
// 構造体 struct tm のメンバを名前で参照する
//
// 例えば
// offsetof_sample( &obj, "tm_hour" );
// とすると obj->tm_hour の値が返る。
//
int
offsetof_sample
(
const struct tm *base, // 構造体へのポインタ
const char *name // メンバの名前
)
{
{for( int i = 0; i < numof( g_membername ); ++i )
{
if ( 0 == strcmp(name, g_membername[ i ].name) )
{
return atoffset( int, base, g_membername[ i ].offset );
}
}}
return -1;
}
| |
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
>> Amazon.co.jp 『たまゆら童子』 へ
>> 楽天ブックス 『たまゆら童子』 へ