Windows C ++:lpctstr vs const tchar
题
在我的应用程序中,我在代码顶部附近声明一个字符串变量,以定义我在调用registerClasSex,createWindowex等的窗口类的名称。跟进THO(根据是否定义Unicode,井或WCHAR),但我想知道是否更好地使用它:
static LPCTSTR szWindowClass = TEXT("MyApp");
或这个:
static const TCHAR szWindowClass[] = TEXT("MyApp");
我个人更喜欢使用LPCTSTR作为JavaScript,PHP,C#背景,我从未真正考虑将字符串声明为一系列字符。
但是,实际上有任何优势比另一个使用,或者实际上对我选择哪种方法没有任何区别?
谢谢您的回答。
解决方案
这两个声明并不相同。第一个创建指针,第二个指针。区别可能并不明显,因为如果您尝试使用阵列,则数组将分解为指针,但是如果您尝试将它们放入结构中,您会立即注意到它。
与LPCTSTR的等效声明是:
static const TCHAR * szWindowClass = TEXT("MyApp");
LPCTSTR中的“ L”代表“ Long”,这是自16位Windows编程以来与之无关的,可以忽略。
其他提示
由于Unicode字符串是Windows NT的本地人WCHAR
或者 wchar_t
类型)。
相对于您的问题,这两种形式可能 似乎 平等的;但是,预计两者都将在可执行的字符串文字的“常数”部分中分配 不一定可以修改 当用作数组初始化器时。
例如:(从C FAQ,16.6)以下代码可能崩溃:
char *p = "HELLO";
p[0] = 'H';
因此,最好总是使用:
char a[] = "HELLO";
再次,来自C常见问题解答:字符串文字可以以两种略有不同的方式使用。作为数组初始化程序(如char a []的声明中,它指定了该数组中字符的初始值。在其他任何地方,它都会变成一个未命名的静态字符数组,可以存储在只读内存中,这就是为什么您不能安全地修改它的原因。在表达上下文中,像往常一样将数组立即转换为指针(请参见第6节),因此第二个声明将P初始化为指向未命名数组的第一个元素。
对于此类型的字符串文字,阵列形式是可取的。所涉及的数据和代码占据(非常非常略有)的空间(非常非常略有),并且变量不能更改为指向另一个字符串。 (实际上,根本没有变量,只是字符串中第一个字符的地址的名称 - 它的行为非常类似于这方面的字面价值。)