【问题标题】:Windows C++: LPCTSTR vs const TCHARWindows C++:LPCTSTR 与 const TCHAR
【发布时间】:2010-06-07 16:44:51
【问题描述】:

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

static LPCTSTR szWindowClass = TEXT("MyApp");

或者这个:

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

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

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

在此先感谢您的回答。

【问题讨论】:

  • 你没有考虑过使用字符串类吗?

标签: c++ windows string winapi tchar


【解决方案1】:

这两个声明不相同。第一个创建一个指针,第二个创建一个 TCHAR 数组。区别可能并不明显,因为如果您尝试使用数组,它将分解为指针,但如果您尝试将它们放入结构中,您会立即注意到它。

LPCTSTR 的等效声明是:

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

LPCTSTR 中的“L”代表“Long”,自 16 位 Windows 编程以来一直不相关,可以忽略。

【讨论】:

  • 我会注意到什么?例如,WNDCLASSEX 结构实际上采用 LPCTSTR 作为 lpszClassName 成员。但是使用 TCHAR 或 LPCTSTR 似乎没有区别。
  • 如果你对它们执行sizeof,你会看到指针是 4 或 8 个字节,而对于长度为 n 的 Unicode 字符串,数组是 2*(n+1)。跨度>
  • @mrl33t:你应该注意到你不需要做任何特别的事情来分配一个数组(用[]声明)——你永远不会有一个悬空指针。如果您使用 LPCSTR(指针),则需要使用 malloc 分配它或为其分配现有指针,否则它将是一个悬空指针。 (你也会注意到sizeof()
【解决方案2】:

由于 Unicode 字符串是 Windows NT 原生的,除非您希望应用程序在 ANSI 原生的 Windows 9x 上运行,否则请始终使用宽字符串(WCHARwchar_t 类型)。

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

例如:(来自 C Faq,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

【讨论】:

  • 啊,但 LPCTSTR 实际上是 CONST CHAR 或 CONST WCHAR 的 typedef(再次取决于是否定义了 UNICODE),因此 szWindowClass[0] = 'H' 甚至无法编译。不过还是谢谢你的建议,我想我会坚持使用 TCHAR。
  • 是的,如果定义了 UNICODE,'H' 将不会与 TCHAR 一起编译。
  • 为什么不能编译?这不是扩大转换吗?
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 2011-07-11
    相关资源
    最近更新 更多