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

Kry*_*ian 0 c c++ scope

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

const char* getFileName(const char* name);
Run Code Online (Sandbox Code Playgroud)

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

name ="someFile",return ="someFile-hd.png"

const char*由此函数返回的函数将立即传递给另一个函数,该函数const char*作为参数

something->loadFile(getFileName("someFile"));
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,当我const char*在我的函数中创建一个范围时,它的范围仅限于它所创建的函数.另一方面,我无法修改loadFile函数代码,因为它是第三方库我我正在使用.

我可以编写一个包装loadFile来删除const char*我创建的包装,但我不想这样做,因为这是一个移植练习,这会打破我创建的一些模板,使其更容易.

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

谢谢

编辑:小解释:

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

hmj*_*mjd 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());
Run Code Online (Sandbox Code Playgroud)

  • @Liho:虽然它很脆弱,但它的工作原理与标准兼容.标准明确保证任何临时都将存活到完整表达式的结尾(即,直到达到`;`),因此`getFileName`的结果将一直存在直到`loadFile`被执行,但不再存在.另一方面,如果有人将它重构为两行`char const*name = getFileName("someFile").c_str(); s-> loadFile(name);`那么这将有未定义的行为 - >脆弱,脆弱...... (3认同)