C/C+には「アスキー文字(半角英数等)」と「ワイド文字(unicodeによる文字・半角全角を含む)」
という二種類の文字型があります。w の付く文字変数や文字列操作関数などは皆、ワイド文字用です。
「char と wchar_t」
「strlen と wcslen」
「std::string と std::wstring」
「MessageBoxA と MessageBoxW」
と言った感じです。
基本的にこの両者は混在させるべきではありません。
char を使うなら全て char, wchar_t を使うなら全て wchar_t にしないと、
文字列処理関数が正常に動作しない可能性があります。
VC++ の TCHAR や LPTSTR などはtypedef、_tcscpy_s や_tcsclen などはマクロになっていて、
コンパイルスイッチでアスキー用の strlen と ワイド文字の wcslen などと切り変えられる
ようになっています。
tchar.h を見ると分かりますが、こういう感じになってます。
#ifdef _UNICODE
typedef wchar_t TCHAR;
#define _tcslen wcslen
#define _tcscpy_s wcscpy_s
#else
typedef char TCHAR;
#define _tcsclen strlen
#define _tcscpy_s strcpy_s
#endif
T系の型や関数を使用することで、二つの文字体系を _UNICODE 定義の有無で切り替えられます。
W系型や関数と、T系の型や関数をソースに混在させると、_UNICODEマクロが切り替わった
とき一部だけがその切り替えに対応されず、問題を起こす可能性があります。
問題を起こさないためには、
・T系だけで統一する。
・W系だけで統一する。
・アスキーだけで統一する。
のどれかにするのが良いという事になります。
ちなみに VisualStudioの場合、Win32プロジェクト等をウィザードを使って生成すると、
コンパイルオプションに _UNICODE が設定されますのでデフォルトではT系=W系になっています。
「空のプロジェクト」などでウィザードを使わなずプロジェクトを生成すると、_UNICODEは設定されず
T系=アスキーになります。
プロジェクトのプロパティ -> 構成プロパティ -> C/C++ -> コマンドライン を選択すると
コンパイルオプションが確認できます。
(「空のプロジェクト」の場合一度ビルドしてからでないとこの項目は出てこないかも)
補足として、
charは文字を表現する以外に、1バイトデータを表現するために使われることもあります。
この用途に限っては、TやWと関係なくいつでも使って問題ありません。
VCではBYTE という型も定義されているので、こちらを使うのも正しい選択です。
