関数マクロ

  引数を文字列化する関数マクロ (文字列化演算子 #)



  
#define FormatTest( strType ) \
	wsprintf( szBuffer, "***%" #strType "***", a ); \
	printf( "%s\n", szBuffer );

// *********************************************************
// エントリボイント
// *********************************************************
int main(int argc, char* argv[])
{

	char szBuffer[512];

	char *a;
	a = "abcd";

	FormatTest( s )
	FormatTest( 8s )
	FormatTest( -8s )
	FormatTest( 08s )

	return 0;
}
  

以下はプリプロセッサの変換結果
  
int main(int argc, char* argv[])
{

	char szBuffer[512];

	char *a;
	a = "abcd";

	wsprintfA( szBuffer, "***%" "s" "***", a ); printf( "%s\n", szBuffer );
	wsprintfA( szBuffer, "***%" "8s" "***", a ); printf( "%s\n", szBuffer );
	wsprintfA( szBuffer, "***%" "-8s" "***", a ); printf( "%s\n", szBuffer );
	wsprintfA( szBuffer, "***%" "08s" "***", a ); printf( "%s\n", szBuffer );

	return 0;
}
  



  よくある計算マクロ



  
#define add( a, b ) a += b

// *********************************************************
// エントリボイント
// *********************************************************
int main(int argc, char* argv[])
{

	int x = 10;

	add( x, 10 );
// 変換すると x += 10; です

	return 0;
}
  





  トークンの一部を置き換えるマクロ (トークン連結演算子 ##)

  
#define idrep( n ) printf( "%d\n", x##n );

// *********************************************************
// エントリボイント
// *********************************************************
int main(int argc, char* argv[])
{

	int x1 = 1;
	int x2 = 2;
	int x3 = 3;

	idrep( 2 );

	return 0;
}
  

  
int main(int argc, char* argv[])
{

	int x1 = 1;
	int x2 = 2;
	int x3 = 3;

	printf( "%d\n", x2 );;

	return 0;
}
  



  いかなるステートメントが含まれてても良いです

  
#define mymax(x,a,b,c) \
if ( a <= b ) { \
	if ( b <= c ) { \
		x = c; \
	} \
	else { \
		x = b; \
	} \
} \
else { \
	if ( a <= c ) { \
		x = c; \
	} \
	else { \
		x = a; \
	} \
}

// *********************************************************
// エントリボイント
// *********************************************************
int main(int argc, char* argv[])
{

	int x;

	mymax(x,20,100,70)

	printf( "%d\n", x );

	return 0;
}
  



  実際のサンプル

  
#define SetOptionFlg(section,ID,name) \
if ( Dlg->ButtonIsCheck( IDC_##ID ) ) { \
	Sql->b##name = 1; \
} \
else { \
	Sql->b##name = 0; \
} \
Ini.WritePrintf( #section, #name, "%d", Sql->b##name );
  

  
	// システムテーブルを表示しない
	SetOptionFlg(SQLServer,NOSYSTEMTABLE,NoSystemTable)

	// システムビューを表示しない
	SetOptionFlg(SQLServer,NOSYSTEMVIEW,NoSystemView)
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ