質問

私のアプリケーションでは、コードの上部近くの文字列変数を宣言して、登録クラスセックス、createwindowexなどへの呼び出しで使用するウィンドウクラスの名前を定義します。 tchar(unicodeが定義されているかどうかに応じてcharまたはwchar)にフォローしてください。しかし、これを使用する方が良いかどうか疑問に思っていました。

static LPCTSTR szWindowClass = TEXT("MyApp");

またはこれ:

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

私は個人的に、LPCTSTRの使用をJavaScript、PHP、C#の背景からの使用を好みます。

しかし、実際には、一方を他方よりも使用することの利点はありますか、それとも実際に私がどちらを選んだかについて違いをもたらさないのでしょうか?

Advancedで、答えをありがとう。

役に立ちましたか?

解決

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

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

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

LPCTSTRの「L」は「LONG」を表しています。これは、16ビットのWindowsプログラミング以来関連しておらず、無視できます。

他のヒント

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つのわずかに異なる方法で使用できます。 Array initializer(char a []の宣言のように)として、その配列内の文字の初期値を指定します。他のどこでも、それは読み取り専用メモリに保存される可能性のある名前のない静的な文字の配列に変わります。そのため、安全に変更できません。式のコンテキストでは、配列は通常どおりポインターに変換されます(セクション6を参照)ので、2番目の宣言はPを初期化して、名前のない配列の最初の要素を指します。

http://linuxdude.com/steve_sumit/c-faq/q1.32.html

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top