2016-07-29 54 views
2

我最近在阅读关于使用const关键字作为函数参数在C中的使用方法以及在When and for what purposes should the const keyword be used in C for variables中提到的使用方法,并且被接受为正确答案。在这篇文章中,有一点提到为什么在通过值传递的参数的头文件的函数声明中const是不必要的?

从来没有在一个函数原型使用const由 值传递的参数。它没有意义,因此只是'噪音'。

我用这样的方式,它为我工作,但我不知道为什么这是一个噪音为按值传递的参数,但不是通过引用(更贴切的指针值传递的参数噪声C,因为在C中没有pass by valuepass by reference的概念)。所以,当我通过一个指针作为函数参数并使用const关键字时,我必须为头文件中的声明和C文件中的定义执行此操作,但我不需要在声明(头文件)中使用const关键字作为非指针参数,只能在定义函数时使用它C文件。

任何解释?

+1

由于您正在传递值,因此更改该值没有实际影响。将它称为const并不是很有用。 –

+1

使用“double sqrt(double)”还是“double sqrt(const double)”对调用代码没有丝毫影响。如果用户有:'double x = 3.14; double y = sqrt(x);''sqrt()'函数不能修改变量'x'而不管'const'是否存在(并且返回类型中的'const'也是毫无意义的) 。尽管如此,指针确实很重要。如果你有'char * fgets(const char * buffer,size_t buflen,FILE * fp);',它承诺不修改缓冲区指向的数据,这使得它无法作为输入函数 - 它必须修改缓冲区。 –

回答

5

您引用的语句有点令人误解,因为在C中,所有参数都是按值传递的。 *我想它是试图区分这些论证本身,对于指针参数的特殊情况,它们是指称对象。

无论如何,问题的关键是const - 在函数声明中限定函数参数不会传递任何信息给调用者。无论如何限制,该函数无论如何都不能修改任何参数的调用者副本,因为参数已通过值传递。

*但是,请注意,数组永远不会传递。在函数调用表达式中,就像在大多数上下文中一样,数组值指向“衰减”指针,而这些指针是按值传递的。这产生了一个类似但不完全相同的效果,如果数组通过引用传递的话会有什么效果。

2

这是规则。如果在声明的函数中,你不标记你的参数const,你可以可以标记它们const定义

一些人喜欢在定义中标记尽可能多的参数const,因为它可以防止功能参数的无意修改;这可能会引入错误。就我个人而言,我不这样做,但大量房屋(包括总部位于苏格兰的大型银行)坚持这种风格。

+0

关于使用'void foo(const int x){...}的动机LSNED' – chux

相关问题