为什么const指针在C中不经常使用

时间:2017-02-11 22:19:08

标签: c const

在C中使用const指针很难看到代码片段和真实代码。

以示例:

FILE *fopen(const char *filename, const char *mode);

我的问题是。为什么它在我看来,我可能会确认这一点,人们通常不使用常量指针,即使有意义使用它? 在我的例子中,fopen可能在两个参数中都有const指针。

我知道如何使用const,我知道它是如何工作的。我的问题更多的是从软件工程的角度来看,为什么写大型图书馆的人不会那么多地使用它。有没有理由不在专业代码中使用const指针?通常我只会在书籍和代码片段中看到很多关于const的内容。

1 个答案:

答案 0 :(得分:4)

C的早期版本(早在1989年的第一个ANSI标准之前)根本不支持const。因此,标准库中的函数(如fopen())最初是在没有const限定符的情况下指定的。

在某些专业设置中,出于向后兼容的原因,有时仍然需要使用旧代码和旧编译器(尽管随着时间的推移这种情况越来越少,它们仍然存在,并且由于各种原因将持续存在一段时间)。这要求在这些设置中使用的库保持向后兼容。

除非存在这样的特定约束,否则最好适当地使用const编写现代代码(例如,表示函数不会更改指针传递的参数)。这为检测程序员错误提供了更多机会(例如,一个更改参数的函数,调用者假定该函数未改变)。

不使用const的代码的一个常见原因是程序员(或更糟糕的是,客户)更关心快速交付 - 获得编译并传递少量测试用例而没有错误的代码优先级为1但是,在每种可能的意外情况下使代码正常工作被认为是不太重要(或其他人的问题)。在这样的设置中const会导致更多编译错误(例如,由于函数更改标记为const的内容),因此需要更多的精力和时间来编译代码。省略const意味着代码更容易编译。删除代码库中的const的所有实例(除非它使用不可用的第三方库)对于现代文本编辑器和IDE来说非常容易 - 并且可以表面上导致编译错误的数量下降。相反,识别const有用的代码中的所有位置更加困难,并且在代码库中增加const使用率的最可能的立即奖励是需要做更多工作来修复代码然后不编译。

换句话说,const的好处不是立竿见影的,所以对于短期“交付或死亡”心态的开发人员/经理/客户来说无关紧要,他们不必随后解决他们的问题留下。