在 C 中很难看到使用 const 指针的代码片段和真实代码。
举例:
FILE *fopen(const char *filename, const char *mode);
我的问题是。为什么在我看来,我可能很难肯定这一点,人们通常不使用 const 指针,即使使用它是有意义的?
在我的示例中,fopen 可能在两个参数中都有 const 指针。
我知道如何使用 const,我知道它是如何工作的。我的问题更多是从软件工程的角度出发,以及为什么编写大型库的人不经常使用它。有理由不在专业代码中使用 const 指针吗?通常我只会在书籍和代码片段中看到很多关于 const 的内容。
C 的早期版本(远早于 1989 年第一个 ANSI 标准)根本不支持 const
。因此标准库中的函数,如 fopen()
最初是在没有 const
限定符的情况下指定的。
在一些专业设置中,出于向后兼容的原因,有时仍然需要使用旧代码和旧编译器(虽然随着时间的推移这种情况越来越少,但它们仍然存在,并且由于各种原因将继续存在一段时间).这要求在这些设置中使用的库保持向后兼容。
除非有这样的特定约束,否则最好适本地使用 const
编写现代代码(例如,指示函数不会更改通过指针传递的参数)。这提供了更多检测程序员错误的机会(例如,更改参数的函数,调用者假定该参数未更改)。
代码不使用 const
的一个常见原因是程序员(或者更糟的是,客户)更关心快速交付 - 交付能够编译并通过一些测试用例而没有错误的代码是优先级为 1,但让代码在所有可能的意外事件中正常工作被认为不那么重要(或其他人的问题)。在这样的设置中,const
会导致更多的编译错误(例如,由于函数更改了标记为 const
的内容),因此需要更多的精力和时间来编译代码。而省略 const
意味着代码更容易编译。使用现代文本编辑器和 IDE 可以很容易地删除代码库中的所有 const
实例(除非它使用无法作为源代码使用的第三方库)——而且表面上会导致编译错误的数量增加降低。相反,识别代码中 const
有用的所有地方更加困难,并且在代码库中增加 const
的使用最有可能的直接奖励是需要做更多工作来修复无法编译的代码。
换句话说,const
的好处不是立竿见影的,所以对于短期内“不交付或死亡”心态的开发人员/经理/客户来说并不重要,他们不必随后修复他们留下的问题。