我有一个linux应用程序,它在实际的Gcc/c++编译器中编译得很好。
我需要在一个非常老的编译器(gcc/c++ 2.96版)中编译它。问题是wstring并不存在。
我在所有系统头中查找wstring。我在g++-3\string中找到了它,但它被注释了。
我试着做了一个简单的Hello world应用来测试它。
我放置了typedef wstring,但是当我执行wstring对象的c_str()时,编译器说它不能将const char *转换为const char*。为什么c_str()返回char而不是wchar?我该怎么解决它呢?
代码如下:
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <iostream.h>
#include <string>
typedef basic_string<wchar_t> wstring;
int main(int argc, char *argv[])
{
char pHW[100];
wstring kk = L"Hello World!";
wcstombs(pHW,kk.c_str(),100); //kk.c_str() returns char * instead wchar_t
cout << "Text:[" << pHW << "]" << endl;
return EXIT_SUCCESS;
}发布于 2014-12-18 20:35:09
一般来说,我的建议就像上面的注释一样;你不应该使用那些标明日期的编译器和标准库。但看起来你别无选择。
如果您唯一的问题是c_str() (即其他方法和运算符可以很好地工作),您可以检查basic_string实现,看看它们是如何实现c_str本身的。
如果它只是简单地返回底层内存的地址,只强制转换为char * (这意味着一个连续的内存块),那么您可以将返回的指针直接转换回wchar_t const *,它可能会工作得很好。
如果basic_string的底层内存块不是连续的,那么您总是可以自己模拟c_str()操作,方法是迭代字符串并将wchar_t复制出来。当然,这在性能方面可能是不可接受的,但我相信您可以根据具体情况解决问题。
如果您的问题比较普遍,您也许能够找到更符合您的编译器和发行版的第三方C++标准库实现(例如STLport等)。
我假设您不想自己实现std::wstring,因为它显然总是一种选择。
发布于 2014-12-18 20:50:57
如果您需要带有旧编译器/库的std::wstring,并且没有实现C++标准,也没有提供它,那么您需要自己实现一个足够的版本。根据您的需要,实现一个版本可能不会太复杂,例如,在std::vector<wchar_t>方面。使用算法可以非常容易地实现大多数std::basic_string<...>函数。
也就是说,如果你希望iostreams能为wchar_t工作,那么几乎所有的希望都破灭了!如果我真的要做这样的事情,我可能会挖掘my standard library实现,并尝试在这个gcc上编译它。如果我没记错的话,它不会包含std::basic_string<...>的实现,但它会包含用于wchar_t的流。
就我个人而言,我认为wchar_t和任何与之相关的东西(以及char16_t和char32_t)都是错误的方向:在std::string中使用UTF-8并为此定义必要的操作。wchar_t没有解决任何问题,但却创造了一些没有它就不存在的新问题(而且,是的,我知道微软被Unicode承诺到处使用它所欺骗--让针对Windows的程序员蒙受损失)。
发布于 2014-12-18 21:32:48
你说你坚持使用这个版本是因为:
我还是有很多方法可以尝试的:
https://stackoverflow.com/questions/27545777
复制相似问题