Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何编写返回const char*的函数,这是一个修改的const char*参数?_C++_C_Scope - Fatal编程技术网

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

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")); 我的问

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

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”);
,那么它不会泄漏,或者会泄漏?而且为了效率,我认为它仍然比构建<