C中的正确性

时间:2012-08-09 00:03:45

标签: c const const-correctness mutability

显然使用const是好习惯,除非某些东西是可变的,但你走了多远?如果我有一个字符串数组,我的函数签名是否应该包括这个?

char const * const * const my_strings

我不会修改无论,所以它是一个常量指针,指向常量字符数组的第一个元素的常量指针数组的第一个元素。这是一个满口,代码几乎是不可读的。所有这些都是一个简单的数据结构,如argv

我觉得const应该是默认值,并且应该有一个mutable关键字。

你通常只是其中一个const吗?那么,如果你仍然可以通过或多或少的解除引用来轻松改变它,那么它有什么意义呢?

1 个答案:

答案 0 :(得分:5)

我通常会使用三个const中的两个:

const char *const *my_strings;

有时我会使用这三种,但在我看来,最后一种是最不重要的。它仅帮助分析使用变量my_strings的代码,而另外两个帮助分析具有指向my_strings指向的数组的任何指针的代码,或者分析由该元素指向的字符串的代码。阵列。这通常是代码,在几个不同的地方(例如函数的调用者和函数本身),因此是一项更难的任务。

使用变量本身的代码仅限于my_strings的范围,因此,如果这是一个自动变量(包括函数参数),那么它就是包含良好且更容易完成的任务。标记const所提供的帮助可能仍然值得赞赏,但它并不那么重要。

我还会说,如果char const * const * const my_strings“几乎不可读”,那么当你有更多的练习阅读C时,这种情况会发生变化,而这种做法比改变代码更好。编写C代码有一些价值,新手很容易阅读,但没有像完成一些工作那么多的价值; - )

您可以使用typedef使变量定义更短,但代价是引入会导致许多C程序员烦恼的间接:

typedef char const *ro_strptr;
ro_strptr const *my_strings;

无论出于何种原因,C程序员经常希望在一个地方尽可能多地查看类型。只有当类型变得非常复杂(指向函数的指针类型)时,才能使用typedef来缩写,而不是期望有人会抱怨它。