3

私のアプリケーションでは、コードの上部近くで文字列変数を宣言して、RegisterClassEx、CreateWindowEx などの呼び出しで使用するウィンドウ クラスの名前を定義しています。これで、LPCTSTR は typedef であり、最終的にはTCHAR(UNICODEが定義されているかどうかに応じてCHARまたはWCHAR)まで続きますが、これを使用する方が良いかどうか疑問に思っていました:

static LPCTSTR szWindowClass = TEXT("MyApp");

またはこれ:

static const TCHAR szWindowClass[] = TEXT("MyApp");

個人的には、文字列を char の配列として宣言することを考えたことのない JavaScript、PHP、C# のバックグラウンドから来た LPCTSTR の使用を好みます。

しかし、実際にはどちらを使用しても利点はありますか、それとも実際にはどちらを選択しても違いはありませんか?

ご回答ありがとうございます。

4

3 に答える 3

6

2 つの宣言は同一ではありません。1 つ目はポインタを作成し、2 つ目は TCHAR の配列を作成します。配列は使用しようとするとポインターに分解されるため、違いは明らかではないかもしれませんが、たとえば構造体に入れようとするとすぐに気付くでしょう。

LPCTSTR と同等の宣言は次のとおりです。

static const TCHAR * szWindowClass = TEXT("MyApp");

LPCTSTR の "L" は "Long" を表し、16 ビット Windows プログラミング以降は関係がなく、無視できます。

于 2010-06-07T16:49:46.310 に答える
3

Unicode 文字列は Windows NT のネイティブであるため、アプリケーションを ANSI ネイティブの Windows 9x で実行する場合を除き、常にワイド文字列 (WCHARまたはwchar_t型) を使用してください。

あなたの質問に関連して、両方の形式は同じように見えるかもしれません。ただし、両方とも実行可能ファイルの定数文字列セクションに割り当てられることが期待されていますが、文字列リテラルは、配列初期化子として使用される場合、必ずしも変更可能ではありません。

例: (C Faq, 16.6 より) 次のコードはクラッシュする可能性があります:

char *p = "HELLO";
p[0] = 'H';

したがって、常に使用することをお勧めします。

char a[] = "HELLO";

繰り返しますが、C Faq から: 文字列リテラルは、2 つのわずかに異なる方法で使用できます。配列初期化子として (char a[] の宣言のように)、その配列内の文字の初期値を指定します。それ以外の場所では、名前のない文字の静的配列になり、読み取り専用メモリに格納される可能性があるため、安全に変更することはできません。式のコンテキストでは、通常どおり、配列はすぐにポインターに変換されます (セクション 6 を参照)。そのため、2 番目の宣言は、名前のない配列の最初の要素を指すように p を初期化します。

http://linuxdude.com/Steve_Sumit/C-faq/q1.32.html

于 2010-06-07T16:48:39.057 に答える
0

このタイプの文字列リテラルには、配列形式が適しています。関連するデータとコードが占めるスペースは (ごくわずかに) 少なくなり、変数を変更して別の文字列を指すようにすることはできません。(実際、変数はまったくなく、文字列の最初の char のアドレスの名前だけです。この点では、リテラル値と非常によく似た動作をします。)

于 2010-06-07T21:15:02.933 に答える