错误:识别器未在c ++中定义

时间:2015-07-21 16:45:51

标签: c++

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

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);

3 个答案:

答案 0 :(得分:5)

您不能像这样使用_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
);

另一个复杂因素是,当您的程序定义_T()时,L 仅将UNICODE后缀应用于字符串文字。如果您希望同时支持Unicode和非Unicode模式,则在未定义std::string时,您需要切换回原始UNICODE等。话虽如此,我已经被认为现在很少有人禁用UNICODE。不过,我不是Windows开发者......

答案 1 :(得分:3)

您无法在_T macro

中调用此功能

该宏扩展为(可能)将L附加到字符串 literal 。您的函数返回std::string,因此您无法将其修改为文字。

要清楚,那就像拥有这个功能

int foo()
{
    return 5;
}

并尝试将其称为

foo().0

这显然不会将您的int转换为double,因为您添加了.0,这将指定双字面

答案 2 :(得分:3)

_T是一个用于处理文字字符串的宏,可以是UNICODE或ANSI字符串,具体取决于项目的设置。如果要同时支持两者,则必须通过在UNICODE构建下返回std :: wstring并调用.c_str()方法将值传递给CreateWindowEx函数来相应地编写getStringFromFile()函数。