Codecvt在gcc中不起作用

时间:2015-02-04 10:59:25

标签: c++ g++ locale codecvt

我正在尝试将自己的codecvt用于标准的iostream。我正在使用这一行:

std::cout.imbue(std::locale(std::locale("C"), new rot13codecvt()));

rot13codecvt只是一个例子,从the interwebs逐字无理地解除了。完整的可运行示例是here。我真正的codecvt做了不同的事情。

正如您在链接的实例中所看到的,这不是完全在g ++中工作。输出不是rot13d。从未调用自定义codecvt类的函数。但它在VS2012中运行良好。

我在“C”旁边尝试了其他语言环境,但没有一个正在运行。还尝试了一个示例here,结果相同。

我做错了什么?

3 个答案:

答案 0 :(得分:2)

使用std::codecvt<...>只需要文件流,并且不要求任何标准流对象按文件流实现。任何一种选择的实施者都有理由。 Dinkumware的实现在其大多数操作中使用<stdio.h>,在这种情况下使用相同的实现是有意义的。 libstdc ++避免了一些开销,直接访问标准C和C ++流之间共享的缓冲区,因此使用不同的流实现。

使用文件流时,std::codecvt<...>方面的使用应保持一致。

答案 1 :(得分:1)

codecvt标头存在于gcc 5.1。

答案 2 :(得分:0)

g ++提供的libstdc ++还没有实现c ++ 11标准。在我的版本中,<codecvt>标题完全丢失。

f.jardon@xxxx 14:40:40 ~
$ find /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/ -name codecvt

f.jardon@xxxx 14:41:17 ~

并不是唯一缺少的东西:

f.jardon@xxxx 14:46:22 ~
$ grep -rl wbuffer_convert 'c:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/include/'
c:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/include/cvt/wbuffer
c:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/include/cvt/xtest
c:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/include/xlocbuf

f.jardon@xxxx 14:46:25 ~
$ grep -rl wbuffer_convert /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/include/c++/