紛らわしいぞ!LPCTSTR、LPTSTR、LPSTR、LPCSTRは全部意味が違う!

TCHAR系の型というのは初めての人にとっては非常に理解しにくい。理解できれば使えるようになるのだが、そうなっても実装に間違えることが多々ある。その理由がこれ。LPCTSTR、LPTSTR、LPSTR、LPCSTR、LPWSTR、LPCWSTRの6つが全て意味が違うということ。ぱっと見ではほとんど同じだがよく見ると「C」が付いていたり、「T」が1つ多かったりと微妙にスペルが異なっている。

これがどう違うのかと言うと...

LPSTR	= char*
LPCSTR	= const char*
LPTSTR	= TCHAR*
LPCTSTR	= const TCHAR*
LPWSTR	= WCHAR*
LPCWSTR	= const WCHAR*
となっている。つまり
LP	= *(ポインタ)
C	= const
TSTR	= TCHAR
STR	= char
WSTR	= WCHAR
というような規則で型の名前が作られている。

非ユニコードビルド環境でプログラミングをしているときは、WSTR系は使うことがほとんどないので、何も考えずにchar*でプログラミングして、エラーがでたらconstを付加するという方法でとりあえず動く。

しかしユニコードビルド環境の場合はTSTRとSTRの間の区別をきちんとしておかないと大変なことになるし、1つのソースコードで非ユニコードとユニコードビルドの両方に対応させようと思ったらいつも違いを意識してプログラミングをしなければならない。
インターネット上にたくさんあるサンプルコードのほとんどはこの区別がなされていない。たいていはTCHAR=charという前提になっているので注意しよう。


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