我在寫一個使用iconv的std :: codecvt構面的實現。 This實現在std :: mbstate_t狀態參數中存儲一個指向堆分配數據的指針。指針是否可以存儲在std :: mbstate_t類型中?
一切工作正常,但這是64位兼容的代碼? 是否有指針大小超過std :: mbstate_t大小的平臺?
我在寫一個使用iconv的std :: codecvt構面的實現。 This實現在std :: mbstate_t狀態參數中存儲一個指向堆分配數據的指針。指針是否可以存儲在std :: mbstate_t類型中?
一切工作正常,但這是64位兼容的代碼? 是否有指針大小超過std :: mbstate_t大小的平臺?
模板codecvt
是否將狀態類型作爲參數?你可以直接使用指針類型嗎?我不記得使用codecvt
的各個類是否在狀態類型上放置了要求。
假設您不能只更改MSVC 2008上的狀態類型...... mbstate_t
是typedef
d作爲int
。該標準只要求int
大於16位,不大於一長,所以它不是64位安全的。我想你需要將索引或鍵存儲到某個數據結構中而不是指針。
更新:
VS2008下以下編譯,至少:
std::wstring const in = L"input";
size_t const buf_size = 256;
char* buf = new char[buf_size];
wchar_t const* char_next;
char * byte_next;
void* state = NULL;
typedef std::codecvt<wchar_t, char, void*> codecvt_t;
codecvt_t::result res =
std::use_facet<codecvt_t>(std::locale()).out(
state, in.c_str(), in.c_str() + in.length(),
char_next, &buf[0], &buf[buf_size], byte_next);
狀態類型與std :: mbstate_t不同的Codecvt在標準流緩衝實現方面基本上沒有用處。使用另一種狀態類型將迫使你重新實現streambuf祖先。 – Basilevs 2009-08-24 02:34:18
C++標準是非常沉默,當涉及到的mbstate_t。該類型實際上由C標準定義。我已經相應地重新標記了你的問題。 – 2009-08-23 19:14:24