2009-10-10 10 views
14

私はCのコードにTCHARの配列を持っています。これは静的な文字列を割り当てたいものです。TCHAR配列に値を代入する方法

私は

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

すべては、この上の正常に動作を経由して、それへの最初の文字列を設定します。しかし、ときに私は

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

そのバグのように2つのラインでそれを分割し、コンパイラエラーを与える:

error C2440: '=': cannot convert from 'const char [14]' to 'TCHAR [260]'

TEXT()機能は、私がここにしたい正確に何をやるべきではないのですか?指定された文字列をTCHARに変換しますか? 2本の線をまとめると、なぜ機能するのですか?それを動作させるためには何を変えなければならないのですか?

私が遭遇したいくつかの他の混乱の事:

私はそれをインターネットで検索したと_T()_TEXT()__T()__TEXT()もあることを見てきました。それらは何のため?どの環境で使うべきですか?

答えて

19

割り当てが機能しない理由は、TCHAR_Tとはほとんど関係がありません。以下は、どちらも動作しません。

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

strcpy(var, "str"); 

あなたの質問の後半部分、TEXT_TについてなどがUnicodeでワイド文字列リテラルにリテラル文字列をオンに構築することを、マクロです。非ユニコードビルドでは、何もしません。

+1

+1 to avakar。副次的に、プロジェクト設定(Unicode/ASCII)に応じて、WCHARまたはcharの代わりにTCHARを使用してください.TCHARマクロはWCHAR/charとして定義されます。同様に、_tcscpy_s、_tcscat_sなどの_tベースの安全な関数を使用します。これらの関数は、あなたのprojに基づいて再度定義されます。 wcscpyまたはstrcpyとして設定します。 私の2セント。 – legends2k

+0

私はこれを試しましたが、このエラーがあります:エラーC2664: 'wcscpy': 'const char [8]'から 'const wchar_t *'にパラメータ2を変換できません –

+0

@ user396483、何を試しましたか?明らかに、str、_tcs、およびwcsのバージョンを混在させています。 – avakar

5

See avakar's answer for the direct answer. I was going to add this as a comment, but it really is a freestanding recommendation. I will warn you up from that this will sound like a rant but it does come from using TCHAR and then working issues for a few years before trying to remove it from a rather large codebase.

TCHARアレイとそのフレンドを使用した場合の効果を実際に理解していることを確認してください。彼らは誤って正しく使用することは困難です。

  • sizeof(TCHAR)条件付きである:これが含まれているコードを精査ここでは、に注意する必要があり、物事の短いリストです。 malloc()またはmemcpy()に渡されているサイズを計算する以外の処理を行っている場合は、間違っている可能性があります。
  • TCHARは、型の別名です:TCHARtypedef以外の何ものでもありませんので、wcscpy(tszStr, wszAry)のようなものを書いて、どれも賢くならないように非常に簡単です。基本的にTCHARです。charまたはwchar_tのいずれかで、過負荷の選択があなたを驚かせるかもしれません。
  • wsprintf()swprintf()が異なる:これは前の特別なケースですが、ここで間違いを犯すのはとても簡単なので特別な配慮があります。

あなたがTCHARを使用する場合は、あなたが定期的に UNICODEとMBCSの両方のバージョンをコンパイルしていることを確認してください。あなたがこれをしないと、最初にそれらを使って得ることを得ようとしている利点を元に戻すでしょう。

ここでは、C++コードを書くときに最初にTCHARを使用しない方法について2つの推奨事項を示します。

  1. CString MFCを使用している場合やMSFTに身を任せている場合は、CStringを使用してください。
  2. タイプ固有のAPIと共にstd::stringまたはstd::wstringを使用してください。適切な場合はCreateFileA()およびCreateFileW()を使用してください。

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

+0

+1、私はもともと同様の暴言を書いていると考えました。個人的には、API境界(つまり、win32 APIの呼び出し前)でのみコードを記録し、utf-8でエンコードされたデータとともに常に 'std :: string'を使用します。 – avakar

+0

@avakar:UTF-8 + std :: stringとUCS-2 + std :: wstringの両方のアプローチを行っています。大文字小文字の区別や比較は、UnicodeではUTF-8よりはるかに簡単ですので、後で説明します。 –

関連する問題