C++ 如何编写返回const char*的函数,这是一个修改的const char*参数?
我必须编写一个函数(c++),它的定义是:C++ 如何编写返回const char*的函数,这是一个修改的const char*参数?,c++,c,scope,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* getFileName(const char* name);
简而言之,这个函数将取名称,检查一些条件并附加后缀,使其成为正确的文件名。例如:
name=“someFile”,return=“someFile hd.png”
此函数返回的const char*
将立即传递给另一个函数,该函数将const char*
作为参数
something->loadFile(getFileName("someFile"));
我的问题是,当我在我的函数中创建一个const char*
时,它的作用域将限制在创建它的函数中。另一方面,我不能修改loadFile
函数的代码,因为它是我正在使用的第三方库
我可以围绕loadFile
编写一个包装器来删除我创建的const char*
,但我不想这样做,因为这是一个移植练习,这会破坏我创建的一些模板,使其更容易
有没有一种方法可以像我描述的那样编写这个函数
谢谢
编辑:
小说明:
getFileName
是我正在尝试编写的一个函数,我可以更改返回类型,但它必须适合作为loadFile
函数的参数。我的主要问题是,getFileName
返回的const char*
要么因为超出范围而丢失,要么我必须显式删除它,这破坏了我的移植模板。我想在一个函数调用中生成文件名,而不做任何其他操作[换句话说,在原始代码中,我有loadFile(“something.png”)
,我想将其更改为loadFile(getFileName(“something”))
之后不添加任何新行。使用const
参数的主要逻辑是,这意味着您不会在接受该参数的函数体中更改该参数
如果要更改它,请不要使用const
不要担心将char*
转换为const char*
。这是隐式转换的
但是,您实际上不需要更改此
const char*
参数。您可以使用它来构造std::string
对象并避免可能的内存泄漏-通过检查答案。如果您可以将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());
从函数返回指针在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);
void getFileName(const char*name,
字符*完整的名称,
尺寸(不完整的名称)
{
…//在临时缓冲区中创建新文件名
if(新文件名具有strlen()LoadFile(name\u buf);
例如,整个windowsapi就是以这种方式调用函数的,将参数的分配留给调用者,让函数只关心它的任务(而不是内存分配等)
当然,这意味着调用者必须键入几行而不是一行。此时,你应该问问自己什么是最重要的:
- 编写干净的函数接口,而不需要模糊的指针返回,也不需要奇怪的、不必要的、泄漏的动态分配,或
- 在调用者中键入尽可能少的代码,以减少键盘和程序员的磨损
getFileName()
具有线程安全/可重入性?如果没有,您可以返回指向该函数的static
本地缓冲区的指针。是的,我正在使用pthreads,希望它具有线程安全性。您可以更改getFileName()的返回类型吗要澄清,你的主要问题是删除GETFILAMNE.H.F.E.D?RigaMIDI返回的conchar *,即使它不需要重新进入,返回静态是一个非常糟糕的想法。考虑<代码>某事>加载文件(GETFILNAMEY(“某个文件”),GETFILNAMEY(“某个其他文件”))
.Oops,它打开了同一个文件两次,忽略了另一个。不要返回指向static的指针,将此变量的分配留给调用者。或者更好,如果这是一个选项,请使用std::string。该死:)我曾想过使用string,但我已返回了结果。c_str()而不仅仅是返回字符串并执行。c_str()之后!非常感谢!这在不破坏我的模板的情况下解决了它!据我所知,使用.c_str()
为此被认为是一种不好的做法,因为您不能依赖std::string result
@Liho的副本的存在,谢谢,但我认为您可以,因为临时对象将一直存在到表达式的结尾。@Liho:这是有效的,符合标准,尽管它很脆弱。标准明确保证任何临时对象将一直存在到完整表达式结束(即,直到到达;
),因此getFileName
的结果将一直存在到执行loadFile
为止,但不再存在。另一方面,如果有人将其重构为两行char const*name=getFileName(“someFile”).c_str();s->loadFile(name)
那么这将有未定义的行为-->脆性,脆性…@MatthieuM.:谢谢,我知道了。不过这是内存泄漏…而且效率稍低,因为strcat
将重新计算第一个字符串的长度,而strcpy
已经存在(尽管这是C API错误,不是您的错误)如果他要调用something->loadFile(getFileName(“someFile”);
,那么它不会泄漏,或者会泄漏?而且为了效率,我认为它仍然比构建<