【问题标题】:Never seen this syntax before, can someone explain..... return L"" [duplicate]以前从未见过这种语法,有人可以解释一下..... return L"" [重复]
【发布时间】:2017-06-01 20:03:48
【问题描述】:

很难在网上找到有关以下语法的解释,并且在这些论坛中搜索 L"" 并没有提供任何结果。我在 Qt5 中调试一个太长而无法粘贴到此处的应用程序。我正在尝试解决最后一个错误,该错误指向包含 --> return L""; 的代码行。

C2440: 'return': 无法从 'const wchar_t[1]' 转换为 'LPWSTR'

我的第一个问题是这是什么意思 --> L""

最后,我该如何解决这个编译器错误?

LPWSTR ImageThread::getLastErrorString(DWORD lastError)
    {
        DWORD result = FormatMessage(
            FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL,
            lastError,
            LANG_USER_DEFAULT,
            errorString,
            sizeof(errorString),
            NULL);
        if (result > 0)
        {
            return errorString;
        }
        else
        {
            return L"";
        }
    }

我的假设是因为 wchar_t[1] 是 1 个字节,而 LPWSTR 是 2 个字节,它无法转换???我不确定这是否重要,但我在 Qt5 的工具栏中出现另一个错误,说“错误:无法使用“UTF-8”编码解码“myfile.cpp”。无法编辑”。它给了我一个选择编码的选项。我确信这是因为这段代码是用旧版本的 Qt 编写的,现在因为我正在用 Qt5 重建所有这些代码,所以发生了一些变化。同样,我不确定这是否与我上面的两个问题有关,但我想全面了解正在发生的事情。

【问题讨论】:

  • 在这些论坛中搜索 L"" 没有提供任何结果所以不是论坛!更新:我的假设是因为 wchar_t[1] 是 1 个字节,而 LPWSTR 是 2 个字节,它无法转换您是如何得出 wchar_t[1] 是一个字节的结论的?还是LPWSTR 是 2 个字节?一般来说,编译器抱怨L""const,而您的函数返回非const 值。
  • 我不能说任何关于错误的信息,但你可以在这里阅读L""之类的字符串字面前缀:en.cppreference.com/w/cpp/language/string_literal
  • 该错误与 L 前缀无关,而是因为 const 已在没有显式强制转换的情况下被分配。然而,MS 对所有 wchar、WCHAR wchar_t 的东西都感到困惑。尝试使用 UTF8 并在最后时刻转换为 MS,当实际与 Windows 函数交互时。
  • 为了编译像L"" 这样的东西,你需要定义UNICODE 预处理器符号,并且可能在你的代码中包含windows.h

标签: c++ qt wchar-t lpwstr


【解决方案1】:

字符串文字(或字符文字)之前的“L”(或“l”,尽管大多数人建议反对它,因为它看起来像1)使其成为“宽”文字,所以它包含wchar_t 而不是char,它的地址是wchar_t * 而不是char *

C 和 C++ 标准没有明确指定宽字符是什么。在 Windows 上,它们通常是 16 位,表示 UTF-16 中的字符串。在大多数类 Unix 系统上,它们通常是 32 位,表示 UCS-4 中的字符串。

在这种特殊情况下,L 后面的 "" 表示它只是返回一个空字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    相关资源
    最近更新 更多