web-dev-qa-db-ja.com

TCHAR配列に値を割り当てる方法

C++コードにTCHAR配列があり、静的文字列を割り当てたいと考えています。

を介してそれに最初の文字列を設定します

_TCHAR myVariable[260] = TEXT("initial value");
_

これですべてが正常に機能します。しかし、私がそれを2行に分割すると

_TCHAR myVariable[260];
myVariable = TEXT("initial value");
_

バグが発生し、コンパイラエラーが発生します。

エラーC2440: '=': 'const char [14]'から 'TCHAR [260]'に変換できません

TEXT()関数は、私がここで望んでいることを正確に実行するべきではありませんか?指定された文字列をTCHARsに変換しますか? 2つの行を組み合わせると、なぜ機能するのですか?それを機能させるために何を変更する必要がありますか?

私が遭遇した他のいくつかの紛らわしいこと:

インターネットで検索したところ、_T()_TEXT()__T()__TEXT()もあることがわかりました。それらは何のため?どの環境でどれを使用すればよいですか?

16
Etan

割り当てが機能しない理由は、TCHARsおよび_Tとはほとんど関係がありません。以下も動作しません。

char var[260];
var = "str";   // fails

その理由は、CおよびC++では、配列を直接割り当てることができないためです。代わりに、要素を1つずつコピーする必要があります(たとえば、strcpy、または場合によっては_tcscpyを使用します)。

strcpy(var, "str");

質問の2番目の部分に関して、TEXT_Tなどはマクロであり、Unicodeビルドでは文字列リテラルをワイド文字列リテラルに変換します。 Unicode以外のビルドでは、何もしません。

21
avakar

直接の答えについては avakarの答え を参照してください。これをコメントとして追加するつもりでしたが、これは本当に独立した推奨事項です。これは暴言のように聞こえますが、TCHARを使用してから数年間問題が発生してから、かなり大きなコードベースから削除しようとすることから警告します。

TCHAR配列とその仲間を使用することの効果を本当に理解していることを確認してください。それらは一見正しく使用するのが難しいです。ここにあなたが注意しなければならないことの短いリストがあります:

  • sizeof(TCHAR)は条件付き:これを含むコードを精査します。 malloc()またはmemcpy()に渡されるサイズの計算以外のことをしている場合は、おそらく間違っています。
  • TCHARはタイプエイリアスですTCHARtypedefにすぎないので、 wcscpy(tszStr, wszAry)のようなものを書くのは本当に簡単で、賢くはありません。基本的に、TCHARどちらかcharまたは_wchar_t_であるため、オーバーロードを選択すると驚くかもしれません。
  • wsprintf()swprintf()は異なります:これは前の特殊なケースですが、ここで間違いを犯すのはとても簡単です!

TCHARを使用する場合は、両方のUNICODEバージョンとMBCSバージョンを定期的にコンパイルするようにしてください。これを行わないと、そもそもそれらを使用することによって得ようとしている利点を取り消す可能性があります。

C++コードを作成するときに、最初にTCHARを使用しない方法について私が持っている2つの推奨事項を次に示します。

  1. MFCを使用している場合、またはMSFTに接続することに慣れている場合は、 CString を使用してください。
  2. _std::string_または_std::wstring_をタイプ固有のAPIと組み合わせて使用​​します-必要に応じてCreateFileA()およびCreateFileW()を使用します。

個人的には後者を選択しますが、文字エンコードと文字列トランスコーディングの問題は時々悪夢にすぎません。

4
D.Shawley