C++コードにTCHAR
配列があり、静的文字列を割り当てたいと考えています。
を介してそれに最初の文字列を設定します
_TCHAR myVariable[260] = TEXT("initial value");
_
これですべてが正常に機能します。しかし、私がそれを2行に分割すると
_TCHAR myVariable[260];
myVariable = TEXT("initial value");
_
バグが発生し、コンパイラエラーが発生します。
エラーC2440: '=': 'const char [14]'から 'TCHAR [260]'に変換できません
TEXT()
関数は、私がここで望んでいることを正確に実行するべきではありませんか?指定された文字列をTCHAR
sに変換しますか? 2つの行を組み合わせると、なぜ機能するのですか?それを機能させるために何を変更する必要がありますか?
私が遭遇した他のいくつかの紛らわしいこと:
インターネットで検索したところ、_T()
と_TEXT()
と__T()
と__TEXT()
もあることがわかりました。それらは何のため?どの環境でどれを使用すればよいですか?
割り当てが機能しない理由は、TCHAR
sおよび_T
とはほとんど関係がありません。以下も動作しません。
char var[260];
var = "str"; // fails
その理由は、CおよびC++では、配列を直接割り当てることができないためです。代わりに、要素を1つずつコピーする必要があります(たとえば、strcpy
、または場合によっては_tcscpy
を使用します)。
strcpy(var, "str");
質問の2番目の部分に関して、TEXT
、_T
などはマクロであり、Unicodeビルドでは文字列リテラルをワイド文字列リテラルに変換します。 Unicode以外のビルドでは、何もしません。
直接の答えについては avakarの答え を参照してください。これをコメントとして追加するつもりでしたが、これは本当に独立した推奨事項です。これは暴言のように聞こえますが、
TCHAR
を使用してから数年間問題が発生してから、かなり大きなコードベースから削除しようとすることから警告します。
TCHAR
配列とその仲間を使用することの効果を本当に理解していることを確認してください。それらは一見正しく使用するのが難しいです。ここにあなたが注意しなければならないことの短いリストがあります:
sizeof(TCHAR)
は条件付き:これを含むコードを精査します。 malloc()
またはmemcpy()
に渡されるサイズの計算以外のことをしている場合は、おそらく間違っています。TCHAR
はタイプエイリアスです:TCHAR
はtypedef
にすぎないので、 wcscpy(tszStr, wszAry)
のようなものを書くのは本当に簡単で、賢くはありません。基本的に、TCHAR
はどちらかchar
または_wchar_t
_であるため、オーバーロードを選択すると驚くかもしれません。wsprintf()
とswprintf()
は異なります:これは前の特殊なケースですが、ここで間違いを犯すのはとても簡単です!TCHAR
を使用する場合は、両方のUNICODEバージョンとMBCSバージョンを定期的にコンパイルするようにしてください。これを行わないと、そもそもそれらを使用することによって得ようとしている利点を取り消す可能性があります。
C++コードを作成するときに、最初にTCHAR
を使用しない方法について私が持っている2つの推奨事項を次に示します。
CString
を使用してください。std::string
_または_std::wstring
_をタイプ固有のAPIと組み合わせて使用します-必要に応じてCreateFileA()
およびCreateFileW()
を使用します。個人的には後者を選択しますが、文字エンコードと文字列トランスコーディングの問題は時々悪夢にすぎません。