const只读本地副本

时间:2010-05-31 13:22:12

标签: c

gcc 4.4.4 c89

我只是想知道将const传递给函数是否值得。

void do_something(const char *dest, const int size)

大小是只读的,所以我不想改变它。但是,一些开发人员从来没有这个,因为它是一个正在使用的本地副本。指针是const,因为您可以更改调用例程中的值。

我总是在只读本地副本上有一个const,因为它向读取我的代码的任何人确认它是一个只读变量。而且,在编码时我没有意识到改变它的错误。

非常感谢任何建议,

4 个答案:

答案 0 :(得分:4)

人们对此的看法不同。我知道一些非常有能力的开发人员为该任何参数编写该const,该参数应该在函数中在本地更改。从逻辑上讲,这只是后续应用const-correctness原则。

但是,无论你做什么,都应该省略标题中函数声明中的const。 const应该只是函数定义的一部分。 C(和C ++也有)具有使其兼容的规则(即,对于没有正文的纯函数声明,忽略值参数的const(当它仅影响其顶层的参数时) 。基本原理是这样的const不会改变与调用者有关的任何内容,因此是被调用函数的实现细节。

这不适用于您的第一个参数。我所知道的任何有能力的开发人员都会把那个const放在那里,因为它为你的函数调用者提供了一个重要的保证(它不会改变指向传入内容的数据)。但是,参数的名称似乎有点奇怪,因为它表明函数 需要写入指向的内容。

请注意,作为结果,您必须将第一个参数本身设为const,就像使用第二个参数一样。因此,这将成为(将其重命名为“来源”,以避免混淆)。

void do_something(const char * const source, const int size)

答案 1 :(得分:3)

就个人而言,我喜欢将const放在尽可能多的变量上 - 我很少在分配后更改变量的值。 (一个值得注意的例外当然是循环计数器/迭代器。)

至少,这显着提高了可调试性,因为它可确保无法更改值。这使得跟踪执行状态变得更加容易。它还提高了可读性,因为它标志着使用不可变值的 intent

因此,我对功能参数也这样做。毕竟,它们的行为与函数内部的正常变量相似。

另一方面,这让许多其他程序员感到困惑,因此在大多数协作项目中,我都不会这样做;它会破坏一致性并适得其反。

答案 2 :(得分:1)

所谓的“const正确性”非常重要,特别是如果你要创建一些模块(例如dll),其他人将使用它。它使得理解函数的目的更容易,并有助于防止一些奇怪的错误(除其他外)。所以,是的,我绝对建议在适用的地方使用const修饰符。

编辑:现在仔细查看函数头,似乎“dest”是函数必须改变的东西。然后将它声明为const似乎很奇怪。

答案 3 :(得分:1)

在我看来,除了一个尖锐的区域之外,没有必要宣布const。标量参数(甚至指针)是本地副本,具有与其他局部变量完全相同的约束。它们实际上是局部变量,有时候使用它们并修改它们可以避免不必要的值复制。

char * strcat(char *d, const char *s)
{
  char *p = d;

  while(*p) p++;
  while(*s) *p++ = *s++;
  *p = 0;
  return d;
}


char * strcat(char *d, const char *s)
{
char *p = d;
const char *s2 = s;

  while(*p) p++;
  while(*s2) *p++ = *s2++;
  *p = 0;
  return d;
}

第二种变体真的更好吗?我不这么认为。

当使用旧的K& R语法时,更明显的是它们是函数的局部变量。

char * strcat(d, s)
char *d;
const char *s;
{
...