【问题标题】:Cannot use wide strings in C/C++ Visual Studio, even though it works in CodeBlocks using MinGW无法在 C/C++ Visual Studio 中使用宽字符串,即使它可以在使用 MinGW 的 CodeBlocks 中使用
【发布时间】:2021-07-14 22:32:00
【问题描述】:

我正在尝试在 Visual Studio 2019 中使用 Windows API。问题是,当我尝试使用以下内容创建宽字符串时:L"Hello World!",我收到错误:' L': 未找到标识符

然后,我尝试使用TEXT() 函数,据我了解,它应该将字符串转换为宽字符串:

char test[1024]; /// contains some text
SetWindowText(DMG_LABEL, TEXT(test));

这里我得到这个错误:'Ltest': undeclared identifier

这适用于使用 MinGW 的 CodeBlocks,所以我不明白为什么它在 VS 中不起作用。 (在 C++ 中测试过,但我很确定在 C 中是一样的)。

我到底做错了什么?

编辑:感谢@anastaciu,我没有意识到我没有使用wchar_t

【问题讨论】:

  • 也许使用wchar_t
  • 如果您展示一个有人可以测试的 10 行程序,您的问题会更好。目前我们必须猜测你有什么错误。
  • 注意:您误解了TEXT。如果定义了UNICODE,它是一个在编译时将字符串文字转换为宽字符串文字(TEXT("string)" 变为L"string")的宏。否则它什么也不做。它不能在运行时转换字符串。 TEXT(test) 将变为 Ltext 并可能导致奇怪的编译器错误。
  • winnt.h 中定义的 TEXT 宏仅用于使用字符串文字,而非变量。要定义 unicode 字符串,请使用 wchar_t 而不是 char 或相关的 WinAPI typedef WCHAR。另一个建议是,您始终指定是否要使用 WinAPI 函数的 Ansi 或 Unicode 版本而不是宏,以防止由于配置错误而可能出现的错误。
  • @H-005 "这对使用 MinGW 的 CodeBlocks 有效" - 如果允许的话,CB/MinGW 就会出现严重问题。 “我不明白为什么它在 VS 中不起作用” - 因为它不应该起作用,原因已经说明(TEXT() 仅适用于文字,不适用于变量)。

标签: c++ c visual-studio winapi widechar


【解决方案1】:

这在 Code::Blocks 中有效,因为 Code::Blocks 很烂。

Code::Blocks 仍然认为,在 2021 年,使用代码页编码是正确的默认设置。结果,TEXT 宏扩展为空。

对于像 Visual Studio 这样的 IDE,它默认使用 Unicode,TEXT 宏扩展为一个标记粘贴序列,将L 打到它的参数上,不管那个参数是什么。它旨在与字符​​串文字一起使用,在这种情况下,它可以满足人们的期望。如果你将它与变量名一起使用,那么,它仍然会在它前面加上一个L

因此,编译器现在可以看到Ltest,而不是test。它要么使用名为Ltest 的符号,要么在找不到它时产生错误。

我到底做错了什么?

您正在使用类似函数的预处理器符号,该符号旨在与字符​​串文字一起使用,而不是字符串文字。

【讨论】:

    【解决方案2】:

    项目属性->高级->字符集=使用Unicode字符集

    或在添加

    之前
    #if !defined(_UNICODE)
    #define _UNICODE
    #endif
    #if !defined(UNICODE)
    #define UNICODE
    #endif
    
    #include  <windows.h>
    

    【讨论】:

    • 这不会改变 TEXT 宏仅适用于字符串文字的事实。
    • 或者提问者只是忘记使用wchar_t
    • 哦,太好了。现在您已经定义了_UNICODEUNICODE_MBCSMBCS。同时!什么可能会出错!?
    猜你喜欢
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    相关资源
    最近更新 更多