为什么以下代码会编译?
void foo(const LPSTR str) {
str[0] = '\0';
}
,而
void foo(LPCSTR str) {
str[0] = '\0';
}
和
void foo(const char* str) {
str[0] = '\0';
}
没有。
我的代码实际上是LPTSTR
所以const
版本是LPCTSTR
...
我可以通过const LPTSTR
之类的内容来提高代码的可读性,或者它必须是LPCTSTR
还是const TCHAR*
?
答案 0 :(得分:7)
typedef从外部修改“封印”类型。 LPSTR
是一个char *
期。向const
添加const LPSTR
会将const
添加到外部:您获得char * const
。
你想要的是“注入”const
(将它应用于指针,而不是指针),这是通过带有typedef的简单声明语法实现的。所以它必须是LPCSTR
,为此目的创建了typedef。
答案 1 :(得分:1)
如果您查看documentation,您会发现LPSTR
是CHAR *
的别名,而CHAR
的别名是char
}}。因此,LPSTR
是char*
的别名。
为什么const LPSTR与const char *?
不同
const
中的 const char *
适用于char
。换句话说,它是一个指向const对象的非const指针。
const
中的 const LPSTR
适用于LPSTR
,我们发现它是char*
。因为LPSTR
是指针,所以这使指针成为常量。它对指针指向const或非const对象没有影响。因此,类型为char * const
。
至于为什么str[0] = '\0';
在str
为const char*
时无法编译,原因是你不能修改const对象。它使用char * const
进行编译,因为您可以修改非const对象。
PS。这个问题存在的事实证明了如何将数据指针类型隐藏在别名后面是令人困惑的。
答案 2 :(得分:0)
答案 3 :(得分:-3)
因为LPCSTR
与(假设的)CLPSTR
不同。