【问题标题】:Error : identificator not defined in c++ [duplicate]错误:C++ 中未定义标识符 [重复]
【发布时间】:2015-10-11 06:08:49
【问题描述】:

我有这个返回字符串的函数:

string getStringFromFile()
    {
    ifstream in("in.txt");
        ofstream out("out.txt");
        std::string line;
        while(getline(in,line)){
        if(line.empty())
              line="http://www.google.com/";
        }

        return line;
    }

当试图调用getStringFromFile函数时,它返回一个语法错误(Error : identificator not defined)

CreateWindowEx(0, _T("EDIT"),
                       _T(getStringFromFile()),
                       WS_CHILD | WS_VISIBLE | WS_BORDER,
                       260, 10,
                       200, 20,
                       hWnd, NULL, hInst, NULL);

【问题讨论】:

  • _T() 是一个宏,只能与字符串文字一起使用。
  • @Mr1Penguin:无法评论低于 10 的声誉旨在鼓励您在评论之前观看和学习,这样您就不会在知道网站如何之前做出不当评论作品。具有讽刺意味的是,您所做的几乎相反,而是将您的评论写成答案,这不是正确的做法。不言而喻,这不是正确的做法(“我知道这是非法的,警官,但是...!”)。迟来的欢迎来到 Stack Overflow!另外,我喜欢你的名字。

标签: c++


【解决方案1】:

你不能像这样使用_T()。它是一个将L 后缀应用于字符串文字的宏,而不是一个可以应用于任意表达式的函数。

您应该从这些库类型的宽字符串版本开始,这基本上等同于您尝试使用 _T() 破解的内容:

  • std::wifstream
  • std::wofstream
  • std::wstring

当您调用 Windows API 函数时,您似乎还必须获取指向字符串数据的指针,而不是尝试传递实际的 C++ 字符串对象。

  • getStringFromFile().c_str()

这将为您提供所需的wchar_t const*,但老实说,我不完全确定临时执行此操作是否安全。这取决于CreateWindowEx 的前提条件。

最安全的方法,IMO:

std::wstring getStringFromFile()
{
    std::wifstream in("in.txt");
    std::wofstream out("out.txt");
    std::wstring line;

    while (std::getline(in,line)) {
       if (line.empty())
          line = "http://www.google.com/";
    }

    return line;
}

// ...

const std::wstring str = getStringFromFile();
CreateWindowEx(0, _T("EDIT"),
               str.c_str(),
               WS_CHILD | WS_VISIBLE | WS_BORDER,
               260, 10,
               200, 20,
               hWnd, NULL, hInst, NULL
);

更复杂的是,当您的程序定义了UNICODE 时,_T()L 后缀应用于字符串文字。如果您希望同时支持 Unicode 和非 Unicode 模式,则需要在未定义 UNICODE 时切换回原始的 std::string 等。话虽如此,我一直相信禁用UNICODE 现在很少见。不过,我不是 Windows 开发人员……

【讨论】:

  • 我仍在拼命寻找适合该问题类别的规范欺骗(_T() 宏与非字符串文字一起使用)。我在 24 小时内第二次过来(当然之前很多次)。
  • @πάνταῥεῖ 也许要多注意阻止自己在 cmets 中回答 :)
【解决方案2】:

你不能在_T macro中调用函数

该宏扩展为(可能)将L 附加到字符串literal。你的函数返回一个std::string,所以你不能像修改它一样修改它。

说得清楚一点,就是有这个功能

int foo()
{
    return 5;
}

并试图将其称为

foo().0

这显然不会将您的 int 转换为 double 只是因为您添加了将指定双重文字的 .0

【讨论】:

    【解决方案3】:

    _T 是一个宏,用于根据项目的设置将文字字符串处理为 UNICODE 或 ANSI 字符串。如果您想同时支持这两种方法,则必须通过在 UNICODE 构建下返回 std::wstring 并调用 .c_str() 方法将值传递给 CreateWindowEx 函数,从而相应地对 getStringFromFile() 函数进行编码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-05
      • 2015-05-12
      • 2012-02-26
      • 2011-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      相关资源
      最近更新 更多