显然使用const
是好习惯,除非某些东西是可变的,但你走了多远?如果我有一个字符串数组,我的函数签名是否应该包括这个?
char const * const * const my_strings
我不会修改无论,所以它是一个常量指针,指向常量字符数组的第一个元素的常量指针数组的第一个元素。这是一个满口,代码几乎是不可读的。所有这些都是一个简单的数据结构,如argv
。
我觉得const应该是默认值,并且应该有一个mutable关键字。
你通常只是其中一个const
吗?那么,如果你仍然可以通过或多或少的解除引用来轻松改变它,那么它有什么意义呢?
答案 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来缩写,而不是期望有人会抱怨它。