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