マクロ 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; } | |