2011-03-09 148 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