与C函数混合时出现C++unique_ptr错误

C++ unique_ptr errors when mixing with C functions

本文关键字:C++unique ptr 错误 函数 混合      更新时间:2023-10-16

我正在混合C和C++代码,遇到了一些问题。以下是无法编译的代码:

unique_ptr<char[]> buf(new char[buflen]);
snprintf(buf, buflen, procfd, fd);

导致错误:

wrapper_current.cpp:85:37:错误:无法将参数"1"的‘std::unique_ptr<char []>’转换为‘char*’‘int snprintf(char*, size_t, const char*, ...)’

我认为unique_ptr看起来像是一个普通的指针,指向使用它的任何对象。有解决办法吗?如果使用snprintf是不可能的,那么有没有一些C++方法可以模仿snprintf

简介

std::unique_ptr<T>有重载,使其感觉像原始指针,但它不能隐式转换为T*(因为它没有重载运算符T(。过载的相关运算符有:

  • operator[];用于访问底层资源的第N个元素(需要T[](
  • operator->;用于访问底层资源的成员,以及
  • operator *;用于获取对基础资源的引用

这些操作员充当"操作员";"代理人";对于底层资源,我们仍然在std::unique_ptr上调用它们,并且您的示例中的buf将始终是std::unique_ptr类型。

注意unique_ptr可以显式转换为bool,这是为了使if (ptr) ...和相关表达式成为可能;也就是说,在这种情况下,让它表现得像原始指针


解释/解决方案

printf相关函数被用于原始指针,这一点很明显,因为智能指针的一部分(函数最初来自哪里(。

如果您想获得std::unique_ptr当前管理的资源的原始指针,适合传递给printf时,请调用your_unique_ptr.get,如下所示:

snprintf (buf.get (), buflen, procfd, fd);