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

时间:2014-12-18 11:42:53

标签: c++ gcc

我的Linux应用程序在实际的Gcc / c ++编译器中编译得很好。

我需要在一个非常旧的编译器(gcc / c ++版本2.96)中编译它。问题是wstring不存在。

我在所有系统头中查找wstring。我在g ++ - 3 \ string中找到了它,但它被评论了。

我尝试做一个简单的Hello world应用程序来测试它。

我把typedef wstring但是当我做一个wstring对象编译器的c_str()时说它不能将const char *转换为const wchar_t *。为什么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;
}

3 个答案:

答案 0 :(得分:1)

一般来说,我的建议就像上面的评论一样;你不应该使用过时的编译器和标准库。但似乎你没有任何其他选择。

如果您的唯一问题是c_str()(即其他方法和运算符正常),您可以查看basic_string实现,了解它们如何实现c_str

如果它只是简单地返回底层内存的地址,只强制转换为char *(这意味着一个连续的内存块),那么你可以将返回的指针强制转回wchar_t const *并且它可能会很好。

如果basic_string的基础内存块不连续,那么您可以自己模拟c_str()操作,方法是迭代字符串并复制wchar_t。当然,这在性能方面可能是不可接受的,但我相信你可以根据具体情况来解决问题。

如果您的问题更为通用,那么可能能够为您的编译器和发行版找到更符合要求的第三方C ++标准库实现(例如STLport等)

我假设您不想自己实施std::wstring,因为它显然总是一种选择。

答案 1 :(得分:1)

如果您需要std::wstring旧编译器/库未实现C ++标准而不提供它,则需要自己实现足够的版本。根据您的需要,实现版本可能不会太复杂,例如,std::vector<wchar_t>。使用算法可以非常轻松地实现大多数std::basic_string<...>函数。

那就是说,如果你希望让iostream为wchar_t工作,那么几乎所有的希望都会消失!如果我真的不得不做那样的事情我可能发掘my standard library实现并试图让它在这个gcc上编译。如果我没记错,它将不包含std::basic_string<...>的实现,但它将包含wchar_t的流。

我个人认为wchar_t及其相关内容(以及char16_tchar32_t)是错误的方向:在std::string中使用UTF-8并定义必要的这方面的行动。 wchar_t没有解决任何问题,但确实创造了没有它的新问题(并且,是的,我知道微软被Unicode承诺在任何地方使用它 - 对于面向Windows的程序员来说是受苦的)

答案 2 :(得分:0)

你说你因使用该版本而被困:

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

恕我直言,仍有实验路径:

  • 虚拟化:虚拟机通常向系统提供简单的硬件,我们使用它来支持旧的应用程序,因此您可以尝试在较新的RH版本上安装旧的应用程序 - 限制:应用程序本身不能依赖于虚拟化无法模拟的专用硬件组件
  • 在特定用户家中安装最近(体面的)gcc发行版,用它来构建你的程序。它或多或少是一些Windows开发人员使用mingw做的 - 限制:你必须能够将这个新程序的开发与旧程序分开。