在我的应用程序中,我在我的代码顶部附近声明了一个字符串变量来定义我的窗口类的名称,我在调用RegisterClassEx,CreateWindowEx等时使用它。现在,我知道LPCTSTR是一个typedef并最终将跟随一个TCHAR(根据是否定义了UNICODE,以及CHAR或WCHAR),但我想知道使用它是否更好:
static LPCTSTR szWindowClass = TEXT("MyApp");
或者这个:
static const TCHAR szWindowClass[] = TEXT("MyApp");
我个人更喜欢使用LPCTSTR来自JavaScript,PHP,C#背景我从未真正考虑将字符串声明为字符数组。
但实际上使用一个优于另一个有什么优势,或者它实际上甚至不会对我选择哪一个产生影响?
先谢谢你的回答。
答案 0 :(得分:5)
这两个声明并不完全相同。第一个创建一个指针,第二个创建一个TCHAR数组。差异可能不明显,因为如果你尝试使用它,数组会分解成指针,但是如果你试图将它们放入结构中,你会立即注意到它。
LPCTSTR的等效声明是:
static const TCHAR * szWindowClass = TEXT("MyApp");
LPCTSTR中的“L”代表“Long”,自16位Windows编程以来没有相关性,可以忽略。
答案 1 :(得分:2)
由于Unicode字符串是Windows NT本机的,除非您希望应用程序在ANSI本机Windows 9x上运行,否则请始终使用宽字符字符串(WCHAR
或wchar_t
类型)。
相对于你的问题,这两种形式可能似乎相等;但是,尽管两者都预期在可执行文件的常量字符串部分中分配,但当用作数组初始值设定项时,字符串文字不一定是可修改的。
例如:(来自C Faq,16.6)以下代码可能崩溃:
char *p = "HELLO";
p[0] = 'H';
所以最好总是使用:
char a[] = "HELLO";
再次,来自C Faq: 字符串文字可以两种略有不同的方式使用。 作为数组初始值设定项(如char a []的声明),它指定该数组中字符的初始值。在其他任何地方,它变成一个未命名的静态字符数组,可以存储在只读存储器中,这就是为什么你不能安全地修改它。在表达式上下文中,数组一如既往地转换为指针(参见第6节),因此第二个声明将p初始化为指向未命名数组的第一个元素。
答案 2 :(得分:0)
对于此类型的字符串文字,数组形式更可取。所涉及的数据和代码占用(非常,非常小)的空间,并且不能将变量更改为指向不同的字符串。 (事实上,根本没有变量,只是字符串中第一个字符的地址名称 - 在这方面它的行为非常像文字值。)