我的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;
}
答案 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_t
和char32_t
)是错误的方向:在std::string
中使用UTF-8并定义必要的这方面的行动。 wchar_t
没有解决任何问题,但确实创造了没有它的新问题(并且,是的,我知道微软被Unicode承诺在任何地方使用它 - 对于面向Windows的程序员来说是受苦的)
答案 2 :(得分:0)
你说你因使用该版本而被困:
恕我直言,仍有实验路径: