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

wstring doesn't exist on gcc/c++ v2.96

本文关键字:不存在 v2 c++ gcc wstring      更新时间:2023-10-16

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

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

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

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

我放了 typedef wstring,但是当我做一个 wstring 对象编译器的 c_str(( 时说它无法将常量字符 * 转换为常量 wchar_t *。为什么 c_str(( 返回字符而不是 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;
}

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

也就是说,如果您希望让iostreams为wchar_t工作,那么几乎所有的希望都失去了!如果我真的必须做这样的事情,我可能会挖掘我的标准库实现并尝试让它在这个 gcc 上编译。如果我没记错的话,它不会包含std::basic_string<...>的实现,但它将包含wchar_t流。

我个人认为wchar_t和与之相关的任何内容(以及char16_tchar32_t(都是错误的方向:在std::string中使用 UTF-8 并为此定义必要的操作。 wchar_t不能解决任何问题,但确实创造了没有它就不存在的新问题(而且,是的,我知道Microsoft被 Unicode 承诺在任何地方使用它所欺骗 - 对于针对 Windows 的程序员来说(。

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

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

如果只是简单地返回底层内存的地址,只强制转换为char *(这意味着一个连续的内存块(,那么您可以将返回的指针直接投射回wchar_t const *,它可能会正常工作。

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

如果您的问题更普遍,您可以找到编译器和发行版的第三方C++标准库实现,这些实现更符合(例如 STLport 等(。

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

你说你被困在那个版本上,因为:

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

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

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