从C ++函数返回对象引用

问题描述

我已经开始学习Arduino的C ++,并且遇到了一些麻烦。 我有一些读取/写入SPIFFS文件功能。 由于打开配置文件代码很常见,我希望有一个单独的函数来处理它。

我想出了以下函数声明

ConfigFileOpenStatus DeviceOpenConfigFile(const char *path,File *file);

函数接受指向char数组的文件路径指针和指向打开文件的指针。 然后我尝试进行以下函数定义

ConfigFileOpenStatus DeviceOpenConfigFile(const char *path,File *file)
{
    if (SPIFFS.exists(path))
    {
        file = &SPIFFS.open(path,"r+");
        return !file ? Failed : Opened;
    }
    else
    {
        file = &SPIFFS.open(path,"w+");
        return !file ? Failed : Created;
    }
}

那没有用,因为编译器抱怨错误错误:接收临时[-fpermissive] 的地址 据我了解,这意味着一旦DeviceOpenConfigFile函数返回,文件对象将被处置?

所以我的问题是,是否有可能以一种可以获得文件对象引用并在以后发布的方式来实现功能

解决方法

  • SPIFFS.open显然按值返回File。返回的值将是该行上可用的临时变量。因此,使用该地址没有任何意义,与int func (void); ... &func()相同的原因也没有任何意义。它与周围的DeviceOpenConfigFile函数无关。
  • 将新地址分配给参数传递的指针没有意义,原因与void func (int x) { x = 0; }毫无意义-只需更改局部变量,调用方的任何内容都不会更改没有任何东西返回给呼叫者。

您正在寻找的解决方案似乎是这样的:

ConfigFileOpenStatus DeviceOpenConfigFile(const char *path,File* file)
{
  ...
  *file = SPIFFS.open(path,"r+");

其中file被分配在呼叫方。