LPSTR,LPCSTR,LPCTSTRなど非常に直感的でないエイリアスが使われている.定義はwinnt.hにある.
LP(long pointer)-C(const)-T(template)-STR(string)と分解される.
templateのTは言語仕様のテンプレートではなくifdefによるmulti-byte character setとUnicode character setの自動的振り分けである.
const char*/const wchar_tのままでいいと思うが下記のtypedefをする.逆に難解になる.
ユニコードの場合,wchar_tをTCHAR,LPCWSTRをLPCTSTRとする.
マルチバイトの場合,charをTCHAR,LPCSTRをLPCTSTRとする.
他にも多くのエイリアスが存在するが同じことなので割愛する.
LP(long pointer)-C(const)-T(template)-STR(string)と分解される.
templateのTは言語仕様のテンプレートではなくifdefによるmulti-byte character setとUnicode character setの自動的振り分けである.
const char*/const wchar_tのままでいいと思うが下記のtypedefをする.逆に難解になる.
- typedef const char* LPCSTR;
- typedef const wchar_t* LPCWSTR;
ユニコードの場合,wchar_tをTCHAR,LPCWSTRをLPCTSTRとする.
- typedef wchar_t TCHAR
- typedef LPCWSTR LPCTSTR
マルチバイトの場合,charをTCHAR,LPCSTRをLPCTSTRとする.
- typedef char TCHAR
- typedef LPCSTR LPCTSTR
他にも多くのエイリアスが存在するが同じことなので割愛する.
- "str" : const char*
- L"str" : const wchar_t*
- _T("str"), _TEXT("str") : プロジェクトの設定による //MFC定義マクロ
以上より,MFC依存部分でファイル名等ではLPCTSTR,リテラルでは_T(x)マクロを使用することで
キャラクターセットの設定に関係なくコンパイルできるコードとなることが期待される.
LPCTSTRやTCHARはプロジェクトの設定に応じてcharとwchar_tを使い分けるものであるが,
これはプリプロセッサの段階で決定される静的なものである.
すなわちテンプレートのようにコンパイル時に型が決定されたり,代入される時に動的に決定されるものではない.
_tprintfも両対応であるが,どちらの設定でもコンパイルできるという意味での両対応であり,
どちらのキャラクターセットでも表示できるという意味ではない.
これはプリプロセッサの段階で決定される静的なものである.
すなわちテンプレートのようにコンパイル時に型が決定されたり,代入される時に動的に決定されるものではない.
//use Multi-byte character set LPCTSTR text = L"ユニコード文字列"; //cannot convert from 'const wchar_t [9]' to 'const char *'は不可である.
_tprintfも両対応であるが,どちらの設定でもコンパイルできるという意味での両対応であり,
どちらのキャラクターセットでも表示できるという意味ではない.
コメントをかく