C 常量只读本地副本

C 常量只读本地副本,c,C,通用条款4.4.4 c89 我只是想知道是否值得将常量传递到函数中 i、 e 大小是只读的,所以我不想更改它。然而,一些开发人员从来没有这样做过,因为const使用的是本地副本。指针是常量,因为您可以在调用例程中更改值 我在只读本地副本上总是有一个常量,因为它向任何阅读我的代码的人确认它是一个只读变量。而且,在编写代码时,我不会在没有意识到的情况下错误地更改它 非常感谢您的建议,所谓的“const correction”非常重要,特别是当您正在创建其他人将使用它的模块(例如dll)时。它使理解函

通用条款4.4.4 c89

我只是想知道是否值得将常量传递到函数中

i、 e

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

我在只读本地副本上总是有一个常量,因为它向任何阅读我的代码的人确认它是一个只读变量。而且,在编写代码时,我不会在没有意识到的情况下错误地更改它

非常感谢您的建议,

所谓的“const correction”非常重要,特别是当您正在创建其他人将使用它的模块(例如dll)时。它使理解函数的用途变得更加容易,并有助于防止一些奇怪的错误(除其他外)。因此,是的,我会明确建议在适用的情况下使用const修饰符

编辑:现在仔细查看函数标题,似乎“dest”是函数必须更改的内容。然后将其声明为const似乎很奇怪。

所谓的“const正确性”非常重要,特别是当您正在创建其他人将使用它的模块(例如dll)时。它使理解函数的用途变得更加容易,并有助于防止一些奇怪的错误(除其他外)。因此,是的,我会明确建议在适用的情况下使用const修饰符


编辑:现在仔细查看函数标题,似乎“dest”是函数必须更改的内容。然后宣布它为常数似乎很奇怪。

人们对此看法不一。我认识一些非常有能力的开发人员,他们为任何不应该在函数中本地更改的参数编写常量。从逻辑上讲,这只是常量正确性原则的后续应用

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

这不适用于您的第一个参数。我所认识的任何有能力的开发人员都会把这个常量放在那里,因为它对函数的调用者做出了重要的保证(它不会改变传递进来的数据)。但是,参数的名称似乎有点奇怪,因为它表明函数确实需要写入指向的内容

请注意,作为结果,您必须使第一个参数本身也是常量,就像您对第二个参数所做的那样。因此,这将变成(也将其重命名为“source”,以避免混淆)


人们对这件事的看法不一。我认识一些非常有能力的开发人员,他们为任何不应该在函数中本地更改的参数编写常量。从逻辑上讲,这只是常量正确性原则的后续应用

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

这不适用于您的第一个参数。我所认识的任何有能力的开发人员都会把这个常量放在那里,因为它对函数的调用者做出了重要的保证(它不会改变传递进来的数据)。但是,参数的名称似乎有点奇怪,因为它表明函数确实需要写入指向的内容

请注意,作为结果,您必须使第一个参数本身也是常量,就像您对第二个参数所做的那样。因此,这将变成(也将其重命名为“source”,以避免混淆)


在我看来,除了在一个指向的区域上声明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;
{
...

在我看来,除了在一个指向的区域上声明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;
{
...

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

至少,这大大提高了可调试性,因为它确保了值不能更改。这使得跟踪执行状态更加容易。它还提高了可读性,因为它表明了使用不可变值的意图

因此,我对func也这样做