C中的正确性

mk1*_*k12 9 c const const-correctness mutability

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

char const * const * const my_strings
Run Code Online (Sandbox Code Playgroud)

我不会被修改它无论如何,所以这是一个常数指针恒定指针的恒定字符阵列的所述第一元件的阵列的第一个元素.这是一个满口,代码几乎是不可读的.这一切都是简单的数据结构argv.

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

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

Ste*_*sop 5

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

const char *const *my_strings;
Run Code Online (Sandbox Code Playgroud)

有时我会使用这三个,但在我看来,最后一个是最不重要的.它只帮助分析使用变量的代码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;
Run Code Online (Sandbox Code Playgroud)

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