3

在我的应用程序中,我在代码顶部附近声明了一个字符串变量,以定义我在调用 RegisterClassEx、CreateWindowEx 等时使用的窗口类的名称。现在,我知道 LPCTSTR 是一个 typedef,最终会跟随一个 TCHAR (以及一个 CHAR 或 WCHAR 取决于是否定义了 UNICODE),但我想知道使用它是否会更好:

static LPCTSTR szWindowClass = TEXT("MyApp");

或这个:

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

我个人更喜欢使用来自 JavaScript、PHP、C# 背景的 LPCTSTR,我从未真正考虑过将字符串声明为字符数组。

但实际上使用其中一种是否有任何优势,或者实际上我选择哪一种并没有什么不同?

提前感谢您的回答。

4

3 回答 3

6

这两个声明不相同。第一个创建一个指针,第二个创建一个 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 上运行,否则请始终使用宽字符字符串(WCHARwchar_t类型)。

相对于您的问题,两种形式似乎都相同;但是尽管两者都应该在可执行文件的常量字符串部分中分配,但字符串文字在用作数组初始值设定项时不一定是可修改的。

例如:(来自 C Faq,16.6)以下代码可能会崩溃:

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

所以最好总是使用:

char a[] = "HELLO";

同样,来自 C Faq: 字符串文字可以以两种略有不同的方式使用。作为数组初始值设定项(如在 char a[] 的声明中),它指定该数组中字符的初始值。在其他任何地方,它都会变成一个未命名的静态字符数组,可能存储在只读内存中,这就是您无法安全修改它的原因。在表达式上下文中,数组像往常一样立即转换为指针(参见第 6 节),因此第二个声明将 p 初始化为指向未命名数组的第一个元素。

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

于 2010-06-07T16:48:39.057 回答
0

数组形式更适合这种类型的字符串文字。所涉及的数据和代码占用(非常非常少)的空间,并且不能将变量更改为指向不同的字符串。(事实上​​,根本没有变量,只是字符串中第一个字符的地址的名称——在这方面它的行为非常像文字值。)

于 2010-06-07T21:15:02.933 回答