【问题标题】:Can I use the _T() macro with a variable? [duplicate]我可以将 _T() 宏与变量一起使用吗? [复制]
【发布时间】:2015-06-13 08:15:34
【问题描述】:
string pagexx = "http://website.com/" + chatname;
string pathxx = "test";
HRESULT resxx = URLDownloadToFile (NULL, _T(pagexx.c_str()),_T(pathxx.c_str()), 0, NULL );

错误是“错误:标识符“Lpagexx”未定义。” 和 pathxx 一样

我不能只输入_T("nice") 之类的字符串,因为我需要其中的聊天名称。我怎样才能做到这一点?

【问题讨论】:

  • 改用wstring。或者查找宽字符串与常规字符串。或在编译器设置中关闭 Unicode。
  • 对于您的下一个问题,我建议您创建一个最小、完整且可验证的示例(此处解释:stackoverflow.com/help/mcve),以便人们可以帮助您解决问题

标签: c++ variables


【解决方案1】:

_T 是一个宏,用于将正确的前缀放在文字上。那不是你正在做的,所以你不想使用_T

您的问题从第一行开始,因为您已经硬编码使用窄字符的字符串(即string 是专门由char 元素组成的字符串),而不是选择适当的字符串类型。见问题Automatically change between std::string and std::wstring according to unicode setting in MSVC++?

【讨论】:

    【解决方案2】:

    如果您的字符串仅包含非 unicode,那么您最简单的解决方案是:

    HRESULT resxx = URLDownloadToFileA (NULL, pagexx.c_str(), pathxx.c_str(), 0, NULL );
    

    _T 的东西至少已经过时了十年,完全没有理由为针对两个不同版本的 Windows API 编译应用程序的复杂性而烦恼。

    如果您的std::strings 包含UTF-8,那么您需要将它们转换为UTF-16,然后调用URLDownloadToFileW

    【讨论】:

      【解决方案3】:

      _T 只是一个带有前缀的宏,它的参数是L(如果用 unicode 编译)。必须使用wchar_t(或wstring 和类似)声明变量

      假设chatname 的类型为wstring

       wstring pagexx = L"http://website.com/" + chatname;
       wstring pathxx = L"test";
       HRESULT resxx = URLDownloadToFile ( NULL, pagexx.c_str(), pathxx.c_str(), 0, NULL );
      

      或者更好(因为你是在微软下编译一些东西,你可以使用更通用的宏,这样你就可以编译相同的代码,无论是否设置UNICODE)。

       _tstring pagexx = _T("http://website.com/") + chatname;
       _tstring pathxx = _T("test");
       HRESULT resxx = URLDownloadToFile ( NULL, pagexx.c_str(), pathxx.c_str(), 0, NULL );
      

      【讨论】:

      • _tstring 未定义,啊,我真是个菜鸟。 :(
      • 好的,关闭 Unicode 对我有帮助。谢谢
      • 除非您在字符串文字前加上 L,否则您的第一个示例将无法编译。您的第二个示例需要一个 _T() 围绕字符串文字的包装器。
      • @Ferruccio 谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2020-08-04
      相关资源
      最近更新 更多