質問: C言語入門 TCHARとWCHARは同じ型でしょうか?
回答: それらは、純粋なC言語の話ではなく、Microsoft Windows という限定された環境下での話だということに、まず留意して下さい。 (つまり、純粋なC言語では、それらは使えませんし、使う必要もありません) WCHAR は、wchar_t 型のことです。 一方、TCHAR は、Win32 API を UNICODEモードで扱いたい場合は、wchar_t 型, そうでない場合は、char 型のことです。 UNICODE モードかどうかは、_UNICODE が define されているかどうか、で決まります。 なぜこのようなものがあるかというと、それは歴史的理由です。 詳しくは↓ この過渡期のために、TCHAR は用意され、古いWindows向けには char, 新しいWindows向けには wchar_t となるようにしていました。 なぜこんなことをしたか、というと、この wchar_t が出来る前は char の1バイトですべての文字が収まるだろうという想定でやっていたところ、1文字を1バイトで表せないような文字(例えば日本語)が現れ始めたからです。 そこで、「2バイトあれば、世界中の1文字を表せるんじゃないか?」という発想で登場したのが、UTF-16という文字コードです。 そして、この文字コードで表した文字を格納するための型として作られたのが、wchar_t です。 (実際のところ、wchar_t はもう少し抽象的に定義されていますが、少なくともwindowsでは、UTF-16を入れる型になっています) だから、この時の想定では、今後は全部 wchar_t に統一したら、分かりやすくていいよね!ということで、統一するつもりで、過渡期として一時的にWCHARを作りました。 (つまり、統一されたら、消すつもりだった、と想定されます) しかし、その後2バイトでも世界中の全ての1文字は表せないぞ、とザワザワし始め...、結局、3バイト、4バイトあってもまだ全部を表しきれない、となってきて、志半ばで、wchar_t に統一できずに、中途半端な形で、現代まで TCHAR が残ってしまっているという現状になっています。 TCHAR はそんな感じの型です。 ということで結局、現代においては、TCHAR はユニコードモードの切り替えを駆使して意識して意図的に使うような型ではない、と思います。 ここは旧環境向けと、新環境向けで文字コードを変えないといけないから TCHAR を使って... のように使う場面はなく、Win32 API の戻り値や引数がTCHARを要求するから...の理由で使うことになるであろうと思います。