C++ 使用void指针参数调用函数的安全方法

C++ 使用void指针参数调用函数的安全方法,c++,openssl,C++,Openssl,我调用的函数如下所示: int BIO_write_filename(BIO *b, char *name) 以下是: std::string filename{"myfile"}; if (BIO_write_filename(bio, filename.c_str()) <= 0) { throw std::runtime_error{"Could not prepare output file.\n"}; } 所以我实际上是在说: long BIO_ctrl(BIO *b

我调用的函数如下所示:

int BIO_write_filename(BIO *b, char *name)
以下是:

std::string filename{"myfile"};
if (BIO_write_filename(bio, filename.c_str()) <= 0) {
    throw std::runtime_error{"Could not prepare output file.\n"};
}
所以我实际上是在说:

long BIO_ctrl(BIO *bp, int cmd, long larg, void *parg);

<>强>从C++调用这个最好的方法是什么?< /强>

到目前为止,我正在考虑以下两种选择:


选项1:c样式转换:

BIO_write_filename(bio, (void*)filename.c_str())

选项> 2:C++类型:

const void* filename_ptr_c{(filename.c_str())};
void* filename_ptr{const_cast<void*>(filename_ptr_c)};
BIO_write_filename(bio, filename_ptr)
const void*filename_ptr_c{(filename.c_str())};
void*filename_ptr{const_cast(filename_ptr_c)};
BIO_写入_文件名(BIO,文件名_ptr)
我的建议:

BIO_write_filename(bio, const_cast<char*>(filename.c_str()));
BIO_write_文件名(BIO,const_cast(filename.c_str());

回答您的问题。使用C++风格的演员表。它们被添加到C++中,因为C++样式可以取代C样式的转换。你可以在这里阅读更多关于C++的理由:

不过,作为奖励,我建议您删除宏。正如你所看到的宏是一个有毒元素在C++中。与您的任一选项相比,一个巨大的改进是:

if(BIO_ctrl(bio, BIO_C_SET_FILENAME, BIO_CLOSE | BIO_FP_WRITE, data(filename)) <= 0L)

<代码>如果你使用C++的OpenSSL,那么BioByCCTL(Bio,BioBixCyStIdFielNAMEY,BioOxLeBiopFPX写,数据(文件名)),然后查看和获取更多的技术。“但是我得到以下错误:<代码>不能将参数4从‘conchchar’转换为‘无效*’/代码>这听起来像OpenSSL错误,因为它们试图支持普通或典型的C++用例。@ JWW如果不是bug,那么它可能被描述为不一致。name用于
BIO_read_filename
的参数,但仅
name
用于
BIO_write_filename
的参数。我还没有足够的信心将此报告为错误…:)
if(BIO_ctrl(bio, BIO_C_SET_FILENAME, BIO_CLOSE | BIO_FP_WRITE, data(filename)) <= 0L)