16

TCHARC++ コードに静的文字列を割り当てたい配列があります。

経由で初期文字列を設定しました

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()。それらは何のため?どの環境でどちらを使用すればよいですか?

4

2 に答える 2

21

TCHAR割り当てが機能しない理由は、と とはほとんど関係ありません_T。以下もうまくいきません。

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

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

strcpy(var, "str");

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

于 2009-10-10T12:24:08.140 に答える
4

直接の回答については、 avakar の回答を参照してください。これをコメントとして追加するつもりでしたが、実際には独立した推奨事項です. これは暴言のように聞こえるかもしれませんがTCHAR、かなり大きなコードベースから削除しようとする前に、数年間問題を使用してから作業した結果であることに注意してください。

TCHAR配列とその仲間を使用する効果を本当に理解していることを確認してください。それらを正しく使用するのは一見難しいです。以下に、注意が必要な事項の短いリストを示します。

  • sizeof(TCHAR)is conditional : これを含むコードを精査します。malloc()またはに渡されるサイズを計算する以外のことをしているmemcpy()場合は、おそらく間違っています。
  • TCHARTCHARtypedefエイリアスですwcscpy(tszStr, wszAry)。基本的に、TCHAR負荷の選択はあなたを驚かせるかもしれません。 charwchar_t
  • wsprintf()swprintf()が異なる: これは前のケースの特殊なケースですが、ここで間違いを犯しやすいので、特別な考慮が必要です!

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

TCHARC++ コードを書いているときにそもそも使用しない方法について、私が持っている 2 つの推奨事項を次に示します。

  1. MFC を使用CStringしている場合、または MSFT に縛られたくない場合に使用します。
  2. std::stringorstd::wstringをタイプ固有の API と組み合わせて使用​​します - 必要に応じて and を使用しCreateFileA()ますCreateFileW()

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

于 2009-10-10T14:28:41.323 に答える