【发布时间】:2012-02-27 19:58:17
【问题描述】:
我要写一个函数(c++),定义是:
const char* getFileName(const char* name);
为了简单起见,这个函数会取名字,检查一些条件并附加一个后缀,使它成为一个正确的文件名。例如:
name = "someFile", return = "someFile-hd.png"
此函数返回的const char* 将立即传递给另一个,它以const char* 作为参数
something->loadFile(getFileName("someFile"));
我遇到的问题是,当我在我的函数中创建一个 const char* 时,它的范围将限于创建它的函数。另一方面,我无法修改 loadFile 的代码函数,因为它是我正在使用的第 3 方库。
我可以在loadFile 周围编写一个包装器来删除我创建的const char*,但我不想这样做,因为这是一个移植练习,这会破坏我创建的一些模板更容易。
有没有办法像我描述的那样编写这个函数?
谢谢
编辑: 小解释:
getFileName 是我正在尝试编写的函数,我可以更改返回类型,但它必须适合作为 loadFile 函数的参数。我的主要问题是getFileName 返回的const char* 要么因为超出范围而丢失,要么我必须明确删除它,这会破坏我的移植模板。我想在一个函数调用中生成文件名,对此不做任何事情[换句话说,在原始代码中我有loadFile("something.png"),我想将其更改为loadFile(getFileName("something")),之后不添加任何新行。
【问题讨论】:
-
getFileName()是否是线程安全的/可重入的?如果没有,您可以返回指向该函数本地的static缓冲区的指针。 -
是的,我正在使用 pthreads,并且希望它是线程安全的,只是为了确定。
-
可以改一下
getFileName()的返回类型吗? -
澄清一下,您的主要问题是删除 getFileName 返回的 const char* 吗?
-
@FrédéricHamidi 即使不需要重入,返回静态也是一个非常糟糕的主意。考虑
something->loadSeveralFiles( getFileName("someFile"), getFileName("SomeOtherFile") );。糟糕,它两次打开同一个文件并忽略了另一个。 不要返回指向静态的指针,将此变量的分配留给调用者。或者更好的是,如果可以选择使用 std::string。