【发布时间】:2014-03-17 16:34:41
【问题描述】:
我正在为混合语言编写一个库,因此我们必须坚持使用 C 接口。我需要调用这个 API 函数:
void getproperty(const char * key, /* in */
char * value /* out */) {
我需要用 std::string 的内容设置 value。
std::string stdString = funcReturningString();
// set value to contents of stdString
我已经看到很多关于可能策略的答案,但没有针对这个特定用例的答案,也没有被认为是“最佳”或“标准”。我们正在使用 C++11,因为它的价值。一些答案含糊地建议将字符串的内容复制到缓冲区并使用它。但是怎么做呢?我想在这次谈话中获得更多意见,以便我最终可以选择一个策略并坚持下去。
谢谢!
更新:这是我使用的解决方案
我使用 uint32_t 与其他 API 函数保持一致。 bufferSize 是一个引用,因为 FORTRAN 通过引用调用所有内容。
void getproperty(const char * key, /* in */
const uint32_t & bufferSize, /* in */
char * value, /* out */
uint32_t & error /* out */)
{
std::string stdString = funcReturningString();
if (bufferSize < str.size() + 1) {
// Set the error code, set an error message, and return
}
strcpy(value, stdString.c_str());
}
我选择了 strcpy() 来保持一切标准,我选择了一个 bufferSize 参数,这样我就不必担心 cmets 中提到的一些双重间接问题。
【问题讨论】:
-
stdString.c_str()有什么问题? -
@P0W,它不返回
char *。 -
strString.c_str()将返回一个 const char*。也许试试this,它是普通的c++,但我不知道你为什么需要c++11 -
这可能已经被问了一百万次了。使用
&str[0]。 -
我将假设该成员的名称
getproperty()是一个强有力的指标,表明该指针的非常量性并非偶然。如果是这样,这是一个写得很糟糕的函数,因为没有指定长度参数来防止缓冲区溢出,作者应该被鞭笞。