2010-06-07 84 views
2

在我的應用程序中,我聲明瞭一個字符串變量,用於定義我的窗口類的名稱,我在調用RegisterClassEx,CreateWindowEx等時使用了它。現在,我知道一個LPCTSTR是一個typedef,並最終將隨之下降到TCHAR(以及取決於UNICODE是否定義CHAR或WCHAR),但我不知道它是否會更好地利用這一點:Windows C++:LPCTSTR vs const TCHAR

static LPCTSTR szWindowClass = TEXT("MyApp"); 

或者這個:

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

我個人更喜歡使用LPCTSTR作爲來自J avaScript,PHP,C#背景我從來沒有真正考慮過將字符串聲明爲一個字符數組。

但是實際上有沒有使用一個優於另一個,或者它實際上甚至沒有影響我選擇哪一個?

謝謝你,先進的,爲您的答案。

+1

您沒有考慮使用字符串類? – jalf 2010-06-07 21:40:12

回答

4

兩個聲明不相同。第一個創建一個指針,第二個是TCHAR數組。差異可能並不明顯,因爲如果嘗試使用它,數組將分解爲指針,但如果嘗試將它們放入結構中,則會立即注意到它。

等效聲明LPCTSTR是:

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

LPCTSTR中的「L」代表「龍」,它一直沒有因爲16位Windows編程相關的,可以忽略不計。

+0

我會注意到什麼?例如,WNDCLASSEX結構實際上爲lpszClassName成員提供了LPCTSTR。但使用TCHAR或LPCTSTR時似乎沒有區別。 – user353297 2010-06-07 16:55:42

+0

如果你在它們上面做一個'sizeof',你會發現指針是4或8個字節,而對於一個長度爲n的Unicode字符串,數組是2 *(n + 1)。 – 2010-06-07 17:00:18

+0

@ mrl33t:你應該注意到你不需要做任何特殊的事情來分配一個數組(用'[]'聲明) - 你永遠不會有懸掛指針。如果你使用LPCSTR(一個指針),你需要用'malloc'分配它,或者爲它指定一個現有的指針,否則它將是一個懸掛指針。 (你還會注意到'sizeof()') – 2010-06-07 17:07:44

2

由於Unicode字符串是Windows NT的本地字符串,除非希望您的應用程序在ANSI本機Windows 9x上運行,否則請始終使用寬字符字符串(WCHARwchar_t類型)。

相對於你的問題,這兩種形式可能似乎相等;但儘管兩者都可以在可執行文件的常量字符串部分進行分配,但在用作數組初始化程序時,字符串文字不一定是可修改的

如:(由C有問必答,16.6)下面的代碼可能會崩潰:

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

所以最好經常使用:

char a[] = "HELLO"; 

同樣,在C常見問題解答: 一字符串文字可以以兩種略有不同的方式使用。 作爲一個數組初始值設定項(如在char a []聲明中),它指定了該數組中字符的初始值。其他任何地方,它都會變成一個未命名的靜態字符數組,它可能存儲在只讀存儲器中,這就是爲什麼您無法安全地修改它的原因。在表達式上下文中,數組一次轉換爲一個指針(參見第6節),所以第二個聲明將p初始化爲指向未命名數組的第一個元素。

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

+0

啊,但LPCTSTR實際上是COND CHAR或CONST WCHAR的typedef(再次取決於是否定義了UNICODE),所以szWindowClass [0] ='H'甚至不會編譯。不過謝謝你的建議,我想我會堅持使用TCHAR。 – user353297 2010-06-07 17:11:28

+0

是的,如果定義了UNICODE,'H'將不能用TCHAR進行編譯。 – 2010-06-07 19:23:15

+0

爲什麼不編譯?這是不是一個擴大轉換? – dan04 2010-06-08 05:16:35

0

數組形式對於這種類型的字符串文字是更可取的。所涉及的數據和代碼佔用(非常非常少的)空間,並且該變量不能被改爲指向不同的字符串。 (實際上,根本沒有變量,只是字符串中第一個字符的地址的名稱 - 它在這方面非常像文字值。)