如何编写一个返回const char *的函数,这是一个修改过的const char *参数?

时间:2012-02-06 10:08:57

标签: c++ c scope

我必须编写一个函数(c ++),其定义是:

const char* getFileName(const char* name);

简而言之,这个函数将取名,检查一些条件并附加一个后缀,使其成为一个正确的文件名。例如:

  

name =“someFile”,return =“someFile-hd.png”

此函数返回的

const char*将立即传递给另一个,其中const char*作为参数

something->loadFile(getFileName("someFile"));

我遇到的问题是,当我在我的函数中创建const char*时,它的范围将限制在它创建的函数中。另一方面,我无法修改{的代码{1}}函数,因为它是我正在使用的第三方库。

我可以在loadFile周围写一个包装来删除我创建的loadFile,但我不想这样做,因为这是一个移植练习,这会打破一些模板我'已经创建,以使其更容易。

有没有办法像我描述的那样编写这个函数?

由于

编辑: 小解释:

const char*是我想写的函数,我可以更改返回类型,但它必须作为getFileName函数的参数。我的主要问题是loadFile返回的const char*要么丢失,要么因为超出范围而丢失,要么我必须明确删除它,这会破坏我的移植模板。我想在一个函数调用中生成文件名而不对它做任何其他事情[换句话说,在原始代码中我有getFileName我希望将其更改为loadFile("something.png")而不添加任何新行这一点。

3 个答案:

答案 0 :(得分:5)

如果您可以将getFileName()的返回类型更改为std::string,则可以执行以下操作:

std::string getFileName(const char* a_name)
{
    std::string result(a_name);
    result += ".png";

    return result;
}

// No memory management req'd
something->loadFile(getFileName("someFile").c_str());

答案 1 :(得分:2)

使用const参数的主要逻辑是,它意味着你不会在接受它的函数体中改变这个参数。

如果您想更改它,请不要使用const

不要担心将char*投射到const char*。有隐含的转换。

尽管如此,您并不需要更改此const char*参数。您可以使用它来构造std::string对象并避免可能的内存泄漏 - 通过hmjd检查答案。

答案 2 :(得分:1)

从函数中返回指针通常在C中没有意义(在C ++中甚至更少)。 既然你用C和C ++标记了这个,这就是C答案。

执行此操作的常用方法如下:

void getFileName (const char* name, 
                  char*       complete_name, 
                  size_t      complete_name_n)
{
  ... // create a new file name in a temp buffer

  if(the new file name has a strlen() < complete_name_n)
  {
    strcpy(complete_name, the new file name);
  }
}

// caller:
char name_buf [N];

getFileName(name, name_buf, N);
something->LoadFile(name_buf);

例如,整个Windows API以这种方式完全调用函数,将参数分配给调用者,让函数仅关注其任务(而不是内存分配等)。

当然,这意味着调用者必须键入多行而不是一行。此时你应该问问自己最重要的是什么:

  • 编写干净的函数接口,没有晦涩的指针返回,也没有奇怪的,不必要的,泄漏的动态分配,
  • 在调用者中键入尽可能少的代码,以减少键盘和程序员的磨损。