【问题标题】:Is it okay to define the actual argument as `const int` but declare it as just `int` in the header?是否可以将实际参数定义为 `const int` 但在标头中将其声明为 `int`?
【发布时间】:2016-09-16 09:38:10
【问题描述】:

请参阅以下程序。

#include <stdio.h>

void f(int a);

int main()
{
  f(10);
  return 0;
}

void f(const int a)
{
  /* a = 20; */ /* Want to avoid accidental modification of a. */
  printf("%d\n", a);
}

在这个程序中,函数f() 的声明与定义不完全匹配。声明有int a作为参数,但定义有const int a作为参数。

这是我对这个程序的问题。

  1. 我相信这没问题,因为调用f() 的代码不必知道实际参数a 是否在f() 中被视为常量。那一点细节是f() 私有的。这与调用代码无关。就调用者而言,在任何一种情况下调用f() 时,对其可见的int a 的任何内容都不会改变。我说的对吗?
  2. 在函数定义中将实际参数声明为const intconst char *const 但在标头中将它们声明为intconst char * 是否常见?如果没有,你推荐这种方式吗?为了使第二个问题保持客观​​,请列出这样做的利弊。

【问题讨论】:

  • 不,这不太好。这应该给出警告,因为实现与声明不同。
  • @MichaelWalz:Clang 和 GCC 都没有对此发出警告,即使在 -std=c11 -pedantic -Wall -Wextra
  • @MichaelWalz 据我了解,f(const int a)f(int a) 对调用者的含义相同,即在任何一种情况下,f() 都无法更改调用者可以看到的关于 a 的任何内容.另外,我用gcc -Wall -Wextra -pedantic -std=c99 foo.c 编译。没有警告。
  • 你的编译器没有显示警告吗?
  • @MichaelWalz 这个代码是正确的

标签: c arguments parameter-passing constants


【解决方案1】:

如果可能的话,一些软件公司坚持标记函数参数const,因为有一种观点认为,如果你这样做,你的函数会更稳定(并且更不容易受到错误重构的影响),因为你不会无意中修改一个输入参数。

C 标准允许您在函数声明中使用非const 参数,并在定义中使用const

我个人不这样做,因为我喜欢我的原型与我的定义相匹配。我想你也会混淆代码分析包。

【讨论】:

  • 您能否指出 C 标准中允许在声明中使用非const 参数和在定义中使用const 的部分? Grzegorz Szpetkowski 的另一个回答似乎与这一说法相矛盾。如果我们可以参考 C 标准来证明这一主张,那就太好了。
  • @LoneLearner:我删除了我的答案,因为在这方面是错误的。更具体地说,我错过了 6.7.6.3/15,它本质上表明 const 限定符已被删除以解决兼容性问题。
  • @GrzegorzSzpetkowski 您可能应该取消删除您的答案并更新它以使其正确。您的回答对 C 标准有非常有用的参考,这将有助于以充分的证据回答这个问题。
  • @Bathsheba 既然您提到您喜欢您的原型以匹配您的定义,那么您使用两种可能的样式中的哪一种? (1)你在定义和声明中都使用const int a吗? (2) 还是在定义和声明中都只使用int a
  • @LoneLearner 已删除答案中的引用不相关,只是 T.C. 评论中的一个,即 6.7.6.3/15。 “在确定类型兼容性和复合类型时,每个声明为函数或数组类型的参数都被视为具有调整后的类型,每个声明为限定类型的参数都被视为具有其声明类型的非限定版本。”跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 2022-01-24
  • 2010-10-24
  • 1970-01-01
  • 2020-12-14
相关资源
最近更新 更多