在我的应用程序中,我在代码顶部附近声明一个字符串变量,以定义我在调用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初始化为指向未命名数组的第一个元素。

http://linuxdude.com/steve_sumit/c-faq/q1.32.html

对于此类型的字符串文字,阵列形式是可取的。所涉及的数据和代码占据(非常非常略有)的空间(非常非常略有),并且变量不能更改为指向另一个字符串。 (实际上,根本没有变量,只是字符串中第一个字符的地址的名称 - 它的行为非常类似于这方面的字面价值。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top