C++在大多數項目中都非常方便,但有時您只需要與現有的C風格函數集成即可。在C基礎設施中集成C++
你如何以一種整潔的方式來做到這一點,特別是如果你使用字符串?
我有一個想法,我可以用構造是這樣的:
std::string buffer;
buffer.resize(1024);
GetBackCStyleString(&buffer[0], 1024);
但是,這會導致問題的字符串長度,因爲它返回的尺寸調整後的長度。有沒有更好的方法來將C函數集成到C++代碼中?
C++在大多數項目中都非常方便,但有時您只需要與現有的C風格函數集成即可。在C基礎設施中集成C++
你如何以一種整潔的方式來做到這一點,特別是如果你使用字符串?
我有一個想法,我可以用構造是這樣的:
std::string buffer;
buffer.resize(1024);
GetBackCStyleString(&buffer[0], 1024);
但是,這會導致問題的字符串長度,因爲它返回的尺寸調整後的長度。有沒有更好的方法來將C函數集成到C++代碼中?
這是一個很好的解決方案。如果您想要的尺寸準確無誤,請在函數返回後再次撥打resize
,然後您可以計算實際長度。
例如
buffer.resize(GetBackCStyleString(&buffer[0], buffer.size());
如果函數返回的長度,或
GetBackCStyleString(&buffer[0], buffer.size()
buffer.resize(strlen(&buffer[0]));
否則。
buffer.c_str()
如果功能需要const char*
或const_cast<char*>(buffer.c_str())
如果功能需要char*
。在後一種情況下要小心謹慎
創建一個普通的char somebuf[somesize];
緩衝區,並讓C函數寫入該函數。 然後使用std::string buffer(somebuf)
從中創建一個std::string
。
如果函數只需要const char *
(即「輸入」參數),只需將yourStdString.c_str()
傳遞給它即可。
額外不必要的副本 – 2011-03-09 16:30:43
@BenVoigt:無論如何,由於一些標準的錯誤,無論如何都是在C++ 03中間接保證的。 :) – 2011-03-09 16:37:54
此外,'&buffer [0]'保留const正確性,'const_cast(buffer.c_str())'不會。 –
2011-03-09 16:46:13
@Tomalek,你能解釋你的評論嗎? C++ 03如何間接保證可寫的字符串緩衝區? – 2011-03-09 17:49:49