为什么我们不经常使用const?

时间:2017-10-07 16:21:19

标签: c const

通常会看到带有指针的关键字const

void function(const char *string)
{
    const char *other_string = "some string";
}

但是为什么我们每次声明一个我们不会改变的变量时都不使用const?很难看到:

void function(const int i)
{
    const double j = 1.2;
    // i and j will not be changed in this function
}

我试图理解为什么我们不经常使用const,在我们能否使用时使用它总是一件好事吗? This post似乎回答“是”,但实际上这种情况似乎并非如此......

3 个答案:

答案 0 :(得分:2)

在大多数情况下,它不再有所作为。

编译器通常能够推断变量实际上是只读的,并在优化过程中将其视为常量。

无论哪种方式,您通常会在const之类的内容使用const char *string,以避免意外修改参数。

由于所有参数都是按值传递的,因此这不是整数所不能发生的事情。仅指针指针本身就是值。

实际上,const char *string尚未完全不变。只有指针所指向的char是,但指针不是变量。只有在将其指定为const char * const string时才会成为。现在,string变量对于函数的范围是完全恒定的。

答案 1 :(得分:2)

如果你给的话,我会总是

void function(const int i)

i的作用是参数化函数行为的情况下 - 这几乎总是如此。如果我在函数体中更改i,我要么犯了错误,要么写了一些其他人以后会发现难以理解的内容。

故意修改函数中i的值不是"危险"通过指针修改实体 - 它不会在函数外部创建副作用。我猜这就是为什么大多数开发人员都没有感受到将原始参数定义为const的压力。但是,我坚持认为,如果一个人关心长期维护,这是明智之举。

答案 2 :(得分:1)

在第二个示例中,参数按值传递,使const基本没有意义。通过引用传递参数时,const最方便。 const称为" const中毒"还有另一个问题。请考虑以下事项:

int foo(char * str, int n)
{
    ...
    bar(str);
    ...
}

如果我们将str设为const,那么我们必须确保该栏还需要const等(这会影响多个文件和模块)。如果您正在编辑旧的和不一致的代码(情况并非如此,但应该考虑),这尤其令人痛苦。