从C中的函数返回常量char*
在我的库中,我必须向调用者返回一个字符串。我返回的字符串将是一个全局数组,调用者的预期用途只是读取字符串。我不想让他们修改它 这是声明函数的正确方法吗从C中的函数返回常量char*,c,api,gcc,constants,C,Api,Gcc,Constants,在我的库中,我必须向调用者返回一个字符串。我返回的字符串将是一个全局数组,调用者的预期用途只是读取字符串。我不想让他们修改它 这是声明函数的正确方法吗 const char * get_some_details(); 当调用方将返回值分配给char*ptr或分配给const char*ptr,但稍后尝试修改时,这将生成警告(仅限gcc) 我这样问是因为我希望像getenv()这样的函数返回const char*。但它返回char*。返回const char* 许多较旧的API不使用const,
const char * get_some_details();
当调用方将返回值分配给char*ptr或分配给const char*ptr,但稍后尝试修改时,这将生成警告(仅限gcc)
我这样问是因为我希望像getenv()这样的函数返回const char*。但它返回char*。返回const char*
许多较旧的API不使用
const
,因为它们早于C90中引入const
(在此之前没有const
。这是正确的方法
许多标准库函数在逻辑上应该是
const char*
时接受或返回char*
,因为历史原因:在C89之前,没有const
;C89之后,如果不破坏应用程序代码,则无法更改其类型签名。一般来说,不要将标准库用作样式指南;它非常古老,包含许多不再被视为良好实践的东西。(coughgets
)幸运的是,C11中删除了gets
。请注意,这一原理不适用于原始帖子中的getenv示例。getenv接受常量char*并返回char*getenv返回char*,因为返回的缓冲区指针不是常量。它包含调用getenv后的结果字符串,但将来调用getenv、setenv或UnsetEnv时可以更改相同的缓冲区,因此getenv()的以下用法不正确?name=getenv(“name”);id=getenv(“id”);使用name&id。对getenv()的第二次调用可能会覆盖之前指向的任何名称