11

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

char const * const * const my_strings

我不会对其进行任何修改,因此它是指向常量数组的第一个元素的常量指针,指向常量字符数组的第一个元素。这很拗口,而且代码几乎不可读。这一切都是一个简单的数据结构,如argv.

我觉得好像 const 应该是默认的,应该有一个 mutable 关键字。

您通常只是其中之一const吗?那么,如果您仍然可以通过或多或少地取消引用来轻松更改它,那又有什么意义呢?

4

1 回答 1

7

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

const char *const *my_strings;

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

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

我还要说,如果char const * const * const my_strings它“几乎不可读”,那么当你有更多的阅读 C 的练习时,情况就会改变,并且最好得到这种练习而不是更改代码。编写新手可以轻松阅读的 C 代码有一些价值,但没有完成一些工作的价值 ;-)

您可以使用 typedefs 来缩短变量定义,但代价是引入了会惹恼许多 C 程序员的间接:

typedef char const *ro_strptr;
ro_strptr const *my_strings;

无论出于何种原因,C 程序员通常希望在一个地方尽可能多地看到一种类型。只有当类型变得真正复杂(指向函数的类型)时,您才能仅使用 typedef 来缩写,而不必半信半疑地有人会抱怨它。

于 2012-08-09T00:17:25.483 回答