C ++为什么const LPSTR与const char *不同?

时间:2016-07-06 09:45:02

标签: c++

为什么以下代码会编译?

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*

4 个答案:

答案 0 :(得分:7)

typedef从外部修改“封印”类型。 LPSTR是一个char *期。向const添加const LPSTR会将const添加到外部:您获得char * const

你想要的是“注入”const(将它应用于指针,而不是指针),这是通过带有typedef的简单声明语法实现的。所以它必须是LPCSTR,为此目的创建了typedef。

答案 1 :(得分:1)

如果您查看documentation,您会发现LPSTRCHAR *的别名,而CHAR的别名是char }}。因此,LPSTRchar*的别名。

  

为什么const LPSTR与const char *?

不同
const中的

const char *适用于char。换句话说,它是一个指向const对象的非const指针。

const中的

const LPSTR适用于LPSTR,我们发现它是char*。因为LPSTR是指针,所以这使指针成为常量。它对指针指向const或非const对象没有影响。因此,类型为char * const

至于为什么str[0] = '\0';strconst char*时无法编译,原因是你不能修改const对象。它使用char * const进行编译,因为您可以修改非const对象。

PS。这个问题存在的事实证明了如何将数据指针类型隐藏在别名后面是令人困惑的。

答案 2 :(得分:0)

  1. const LPSTR被解析为char* const:只有指针是常量,您可以修改其内容。看看它的定义here。所以你的第一个例子是编译
  2. LPCSTR已解析为const char*,因此您无法修改其内容。您可以看到其定义here。所以你的第二个例子没有编译
  3. 再次使用const char*,您无法修改其内容,因此您的上一个示例无法编译

答案 3 :(得分:-3)

因为LPCSTR与(假设的)CLPSTR不同。