首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在gcc/c++ v2.96上不存在wstring

在gcc/c++ v2.96上不存在wstring
EN

Stack Overflow用户
提问于 2014-12-18 19:42:53
回答 3查看 626关注 0票数 0

我有一个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?我该怎么解决它呢?

代码如下:

代码语言:javascript
复制
#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;
}
EN

回答 3

Stack Overflow用户

发布于 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,因为它显然总是一种选择。

票数 1
EN

Stack Overflow用户

发布于 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_tchar32_t)都是错误的方向:在std::string中使用UTF-8并为此定义必要的操作。wchar_t没有解决任何问题,但却创造了一些没有它就不存在的新问题(而且,是的,我知道微软被Unicode承诺到处使用它所欺骗--让针对Windows的程序员蒙受损失)。

票数 1
EN

Stack Overflow用户

发布于 2014-12-18 21:32:48

你说你坚持使用这个版本是因为:

  • 您有一个在专用硬件上运行的应用程序
  • 此硬件仅支持RH7.3或更早版本的

我还是有很多方法可以尝试的:

  • virtualization :虚拟机通常向系统提供简单的硬件,我们用它来支持旧的应用程序,所以你可以尝试在更新的RH版本限制上安装你的旧应用程序:应用程序本身不能依赖于一个特定的硬件组件,虚拟化不能依赖于一个特定的用户家庭最近(像样的) gcc发行版,并使用它来构建你的程序。这或多或少就像一些windows开发人员使用mingw - limit所做的那样:您必须能够将这个新程序的开发与旧程序的开发分开。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27545777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档