【问题标题】:Why is PCTSTR not defined but LPCTSTR defined?为什么没有定义 PCTSTR 而定义了 LPCTSTR?
【发布时间】:2012-01-30 11:48:26
【问题描述】:

我已被分配更新用 MSVC++ 6 编写的旧代码。我收到了 PCTSTR 的未知定义,但即使包含 tchar.h 也没有定义。根据我以前的经验,我知道有 LPTSTR 但没有 PCTSTR。

我 grep C:\Program Files\Microsoft Visual Studio\VC98\Include\ 文件夹并没有找到 PCTSTR 的定义。但令我惊讶的是,当我搜索 Windows SDK 文件夹 [C:\Program Files\Microsoft SDK] 时,没有 PCTSTR 的定义,但它被用于其中一个示例。 [C:\Program Files\Microsoft SDK\Samples\winui\Resource\Iconpro*]。所以我猜这可能只是 16 位 Windows 的 Windows API 的遗物,但我无法从谷歌找到任何东西。

有谁知道 PCTSTR 是干什么用的。我猜是因为这是来自以前有效的旧代码。任何想法如何进行编译? [我把这个改成LPCTSTR并编译好了,我想知道除了改定义名还有没有其他办法]

【问题讨论】:

    标签: visual-c++ winapi tchar


    【解决方案1】:

    LPCTSTR 中的 LP 表示长指针。它是从Windows 3 天回来的神器,一个16 位的操作系统。当您只有一个 16 位 cpu 寄存器时,16 位代码有多个内存模型来处理尝试寻址超过 65536 字节的内存。短指针使用默认数据段寄存器值和 16 位偏移量。长指针为 32 位,16 位用于加载段寄存器,16 位用于偏移。

    LPCTSTR 中的 T 表示 TCHAR,是 char 或 wchar_t 的 typedef,取决于 UNICODE 宏的存在。

    这使得 PCTSTR 成为时代不合时宜的人类和恐龙电影风格。从来没有 16 位 Unicode 版本的 Windows,32 位版本的 Windows 总是使用 32 位指针。这听起来只是一个错误。尽管如此,当前版本的 winnt.h 确实 有一个 typedef,使其与 LPCTSTR 相同。并且只在一个的地方使用,stralign.h 标头带有一个名为 TSTR_ALIGNED_STACK_COPY 的奇怪函数。但是,仅在评论中。

    错误。您的解决方法是正确的选择。

    【讨论】:

    • 当我读到你的文章时,有时我会产生一种错觉,因为你看起来像Raymond Chen。 :)
    • 呵呵,我们年龄差不多,可能有关系。
    • 哇。不过,Raymond Chen 一直住在 SO。你知道吗? stackoverflow.com/users/902497/raymond-chen
    【解决方案2】:

    在我的机器上的 Windows SDK v7.0a 中,WinNT.h 包含两种不同的 PCTSTR 类型定义,具体取决于是否定义了 UNICODE。在这两种情况下,LPCTSTR 的定义方式相同 - 所以现在这两者是等价的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-25
      • 2016-07-24
      • 2020-01-01
      • 2013-08-16
      • 1970-01-01
      • 1970-01-01
      • 2017-03-05
      • 2018-02-11
      相关资源
      最近更新 更多