C++ 为什么常量 LPSTR 与常量字符 * 不同

C++ Why const LPSTR is different than const char *?

本文关键字:常量 不同 字符 LPSTR 为什么 C++      更新时间:2023-10-16

为什么编译以下代码?

void foo(const LPSTR str) {
    str[0] = '';
}

void foo(LPCSTR str) {
    str[0] = '';
}

void foo(const char* str) {
    str[0] = '';
}

不。

它实际上在我的代码中LPTSTR const所以版本LPCTSTR......那么我可以通过拥有类似 const LPTSTR 的东西来提高代码可读性,或者它必须是LPCTSTRconst TCHAR*

typedef "密封"类型,防止外部修改。 LPSTR是一个char *时期。添加const(如const LPSTR)将const添加到外部:你会得到一个char * const

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

如果你看一下文档,你会发现LPSTRCHAR *的别名,而CHAR又是char的别名。因此LPSTRchar* 的别名。

为什么常量

LPSTR 与常量字符 * 不同?

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

const const LPSTR适用于LPSTR,正如我们所发现的,char*。因为LPSTR是一个指针,所以这使得指针恒定。它对指针指向常量对象还是非常量对象没有影响。因此,类型是 char * const .


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


附言。这个问题存在的事实表明,将数据指针类型隐藏在别名后面是多么令人困惑。

  1. const LPSTR解析为 char* const :只有指针是常量,您可以修改其内容。在这里看看它的定义。所以你的第一个示例编译
  2. LPCSTR解析为const char*,因此您无法修改其内容。你可以在这里看到它的定义。所以你的第二个示例无法编译
  3. 同样使用const char*您无法修改其内容,因此您的最后一个示例无法编译

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