2012-01-24 142 views
2

在我的库中,我必须返回一个字符串给调用者。我返回的字符串将是一个全局数组,调用者的预期用途是读取字符串。我不想让他们修改它..从C函数返回const char * *

这是声明函数的正确方法..

const char * get_some_details(); 

这应该产生一个警告(只试过GCC)既可以当主叫用户分配收益值赋给char * ptr或赋值给const char * ptr,但稍后尝试修改它。

我问,因为我希望喜欢的getenv()函数返回为const char *。但它返回char *。返回const char *有没有问题?

+0

getenv返回char *,因为返回的缓冲区指针不是常量。它包含了你的结果字符串调用getenv之后,但未来调用GETENV,SETENV是可以改变的是相同的缓冲器,或unsetenv – TJD

+0

所以GETENV以下使用()是不正确的名称= GETENV(“NAME”)?; ID = GETENV( “ID”);使用名称和编号。第二次调用getenv()可以覆盖任何名称指向之前 – Manohar

回答

5

返回const char*正是在这种情况下做正确的事。

许多旧的API不使用const,因为它们在C90中引入了const之前(此前没有const)。

+0

感谢您的快速响应 – Manohar

+0

请注意,此原理不适用于getenv在原始帖子中的示例。 GETENV需要一个const char *与返回一个char * http://pubs.opengroup.org/onlinepubs/009604499/functions/getenv.html – TJD

2

这是做正确的方式。

由于历史原因,许多标准库函数在逻辑上应该返回char *,因为历史原因:C89之前,没有const;后C89,他们的类型签名不能改变而不破坏应用程序代码。作为一般规则,不是使用标准库作为风格指南;它很古老,包含许多不再被认为是好的做法。 (咳嗽gets

+0

感谢快速反应 – Manohar

+0

幸运的是,'gets'在C11去除。 –

相关问题