TCHARとかLPCTSTR、LPTSTRって何???

Windowsプログラミングからは切っても切り離せないのが、TCHARと、LPCTSTR、LPTSTRなどのTCHAR系列の型。結論から書くとこれはソースコードをユニコードと非ユニコード両対応にするための型だ(何のことだかサッパリ分からないって?こういうプログラミングの授業じゃ習わない意味不明な拡張が多いからWindowsプログラミングはややこしいんですよね)。

何も考えずに

・TCHAR = char
・LPCTSTR = const char*
・LPTSTR = char*

と頭の中で置き換えて使っている人も多いのではないだろうか?実際、この置き換え方はそう大きく間違えたものではない。

CHARは文字型を意味しているし、STRは文字列型を、LPは*(ポインタ)、LPCのCはconstを示している。問題は残った「T」という文字だ。これは...私にも分かりません(かなり無責任ですが本当に分かりません)。

分かっていることは、例えばTCHARは以下のように定義されているということです。

#ifdef UNICODE
	typedef WCHAR    TCHAR;
#else
	typedef char     TCHAR;
#endif

このことから「UNICODE」が定義されているとTCHARはWCHAR、定義されていないと「char」と同一になります。つまり、前に挙げた

・TCHAR = char
・LPCTSTR = const char*
・LPTSTR = char*

というのは「UNICODE」が定義されていないときの置き換えということになり、「UNICODE」が定義されているときには

・TCHAR = WCHAR
・LPCTSTR = const WCHAR*
・LPTSTR = WCHAR*

という関係になります。

くどいようですが「UNICODE」を定義しなければ、TCHARはcharと同義なわけです。よく分からないTCHARやWCHARという型の意味は放っておいて、charであれば馴染みやすい型であり、扱いやすいと思う人も多いでしょう。

では、「UNICODE」を定義しないようにするにはどうすればいいかと言うと...

例えば「MFCアプリケーションウィザード」では、「アプリケーションの種類」の設定項目の中に
「ユニコードライブラリを使用する」というチェックボックスがあります。このチェックを外せばOKです。
tchar01.gif


既にプロジェクトができている場合は、「プロジェクト」メニューの「プロパティ」からプロジェクトの設定画面を開き、左側のツリーで「構成プロパティ」の「全般」を選択します。そして「文字セット」を「マルチバイト文字セットを使用する」に変更すればOKです。
tchar02.gif

これらの設定を行えば、

・TCHAR = char
・LPCTSTR = const char*
・LPTSTR = char*

というように置き換えて利用して問題ありません。

本当はTCHARとchar、WCHARの違いをきちんと把握してプログラミングするべきです。しかし上のように置き換えてTCHAR=char!と考えても上記のプロジェクトの設定さえきちんとしていれば困ることはまずありません。「多言語プログラミング」や「ユニコード」などに興味を覚えたら「TCHARは「UNICODE」を定義するとWCHARになる」ということを思い出して再びTCHARについて勉強してみてください(今後きちんとTCHARの使い方などについての説明をしたいと思います)。
TCHARなどのことをきちんと知っている方がこの文章を読んでいたら...ごめんなさい。あまりお怒りにならず「変なことを書いてるなぁ」と笑い飛ばしていただければと思います。

コメント (1)

NISHI:

TCHAR は Typed CHAR の略ではないかと、
私は勝手に思ってますです、はい。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)


カテゴリー「文字列操作」 のエントリー