错误:标识符未在c++中定义

Error : identificator not defined in c++

本文关键字:c++ 定义 标识符 错误      更新时间:2023-10-16

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

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()。它是一个将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开发人员& help;

不能在_T宏中调用该函数

宏扩展为(可能)将L附加到字符串文字。你的函数返回一个std::string,所以你不能把它当作一个文字来修改。

要清楚,这就像有函数

int foo()
{
    return 5;
}

并将其命名为

foo().0
这显然不会将int转换为double,因为您添加了.0,它将指定双字量

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