#のマクロ定義での役割

725 ワード

C/C++で#マクロの変数名を文字列に変換
例えばMFCソースでは
struct AFX_MAP_MESSAGE
{
	UINT    nMsg;
	LPCSTR  lpszMsg;
};

#define DEFINE_MESSAGE(wm)  { wm, #wm }

static const AFX_MAP_MESSAGE allMessages[] =
{
	DEFINE_MESSAGE(WM_CREATE),
	DEFINE_MESSAGE(WM_DESTROY),
	DEFINE_MESSAGE(WM_MOVE),
//    
	DEFINE_MESSAGE(WM_DEVICECHANGE),
	{ 0, NULL, }    // end of message list
};

#undef DEFINE_MESSAGE

この方法により,列挙,定数,マクロ名の文字列出力リストを容易に形成できる.次のコードで値を文字列に変換できます.
UINT nMsg = WM_CREATE; 
LPCSTR lpszMsgName = NULL;
const AFX_MAP_MESSAGE* pMapMsg = allMessages;
for (/*null*/; pMapMsg->lpszMsg != NULL; pMapMsg++)
{
	if (pMapMsg->nMsg == nMsg)
	{
		lpszMsgName = pMapMsg->lpszMsg;
		break;
	}
}