2011-03-09 104 views
3

C++在大多數項目中都非常方便,但有時您只需要與現有的C風格函數集成即可。在C基礎設施中集成C++

你如何以一種整潔的方式來做到這一點,特別是如果你使用字符串?

我有一個想法,我可以用構造是這樣的:

std::string buffer; 
buffer.resize(1024); 

GetBackCStyleString(&buffer[0], 1024); 

但是,這會導致問題的字符串長度,因爲它返回的尺寸調整後的長度。有沒有更好的方法來將C函數集成到C++代碼中?

回答

1

這是一個很好的解決方案。如果您想要的尺寸準確無誤,請在函數返回後再次撥打resize,然後您可以計算實際長度。

例如

buffer.resize(GetBackCStyleString(&buffer[0], buffer.size()); 

如果函數返回的長度,或

GetBackCStyleString(&buffer[0], buffer.size() 
buffer.resize(strlen(&buffer[0])); 

否則。

0

buffer.c_str()如果功能需要const char*const_cast<char*>(buffer.c_str())如果功能需要char*。在後一種情況下要小心謹慎

+0

@BenVoigt:無論如何,由於一些標準的錯誤,無論如何都是在C++ 03中間接保證的。 :) – 2011-03-09 16:37:54

+0

此外,'&buffer [0]'保留const正確性,'const_cast (buffer.c_str())'不會。 – 2011-03-09 16:46:13

+1

@Tomalek,你能解釋你的評論嗎? C++ 03如何間接保證可寫的字符串緩衝區? – 2011-03-09 17:49:49

0

創建一個普通的char somebuf[somesize];緩衝區,並讓C函數寫入該函數。 然後使用std::string buffer(somebuf)從中創建一個std::string

如果函數只需要const char *(即「輸入」參數),只需將yourStdString.c_str()傳遞給它即可。

+3

額外不必要的副本 – 2011-03-09 16:30:43