【问题标题】:returning const char * from a function in C从 C 中的函数返回 const char *
【发布时间】:2012-02-18 02:25:31
【问题描述】:

在我的库中,我必须向调用者返回一个字符串。我返回的字符串将是一个全局数组,调用者的预期用途只是读取字符串。我不希望他们修改它..

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

const char * get_some_details();

当调用者将返回值分配给 char * ptr 或分配给 const char * ptr 但稍后尝试修改它时,这应该会生成警告(仅尝试 gcc)。

我问是因为我希望像 getenv() 这样的函数返回 const char *。但它返回 char *。返回 const char * 有什么问题吗?

【问题讨论】:

  • getenv 返回 char* 因为返回的缓冲区指针不是常量。它包含调用 getenv 后的结果字符串,但以后调用 getenv、setenv 或 unsetenv 可以更改相同的缓冲区
  • 所以下面getenv()的用法不正确?name=getenv("NAME"); id=getenv("ID");使用名称和 ID。第二次调用 getenv() 可以覆盖之前指向的任何名称

标签: c api gcc constants


【解决方案1】:

这是正确的做法。

许多标准库函数在逻辑上应该是const char *时接受或返回const char *,由于历史原因:C89之前,没有const;在 C89 之后,如果不破坏应用程序代码,就无法更改它们的类型签名。作为一般规则,不要将标准库用作样式指南;它非常古老,包含许多不再被认为是好的做法。 (咳嗽gets

【讨论】:

  • 幸运的是,gets 在 C11 中被删除了。
【解决方案2】:

在这种情况下,返回 const char* 是完全正确的做法。

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

【讨论】:

猜你喜欢
  • 2016-06-10
  • 2012-05-26
  • 1970-01-01
  • 2021-11-23
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
  • 2022-01-16
相关资源
最近更新 更多