[英]Const-correctness in C
显然,使用const
是一种好习惯,除非某些东西是可变的,但你走了多远? 如果我有一个字符串数组,我的函数签名是否应该包括这个?
char const * const * const my_strings
我不打算被任何修改它,所以它是一个常数指针恒定指针的恒定字符阵列的所述第一元件的阵列的第一个元素。 这是一个满口,代码几乎是不可读的。 所有这些都是像argv
这样简单的数据结构。
我觉得const应该是默认的,并且应该有一个mutable关键字。
你一般只是其中一个const
吗? 那么,如果您仍然可以通过解除引用或多或少来轻松地改变它,那又有什么意义呢?
我通常会使用三个const
的两个:
const char *const *my_strings;
有时我会使用这三个,但在我看来,最后一个是最不重要的。 它只帮助分析使用变量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来缩写,而不是期望有人会抱怨它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.