[PR]

offsetof マクロを使う

戻る

 マクロ offsetof() は構造体の先頭からメンバへのオフセットを与えます。
 マクロ 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;
	}

Google
ご意見・ご感想をお聞かせ下さい。匿名で送信できます。

 * 返信が必要な場合には postmaster@katsura-kotonoha.sakura.ne.jp へ直接メールしてください。

水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp