为什么在按值传递的参数的头文件中的函数声明中不需要 const?

Why is const unnecessary in function declarations in header files for parameters passed by value?

我最近在阅读有关 const 关键字在 C 中作为函数参数的用法以及 When and for what purposes should the const keyword be used in C for variables 中提到的使用方法,并被接受为正确答案。在这个post中,有一点提到

Never use const in a function prototype for a parameter passed by value. It has no meaning and is hence just 'noise'.

我用过这种方式,它对我有用,但我不确定为什么这对于按值传递的参数是 噪声 而对于按引用传递的参数不是噪声(更恰当的说法是 C 中的指针值,因为 C 中没有 pass by valuepass by reference 的概念)。因此,根据这个解释,当我将指针作为函数参数传递并使用 const 关键字时;我必须对头文件中的声明和 C 文件中的定义执行此操作,但我不需要在声明(头文件)中将 const 关键字用于非指针参数,并且仅在在 C 文件中定义函数。

有什么解释吗?

这是规定。如果在一个函数的声明中,你没有标记你的参数const,你可以标记它们const定义.

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

你引用的语句有点误导,因为在 C 中,所有 参数都是按值传递的。* 我想它是试图区分参数本身,以及对于作为指针的参数的特殊情况,它们的引用。

无论如何,要点是 const- 在函数声明中限定函数参数不会向调用者传达任何信息。不管这样的限定,函数无论如何都不能修改调用者的任何参数的副本,因为参数是按值传递的。

*但是请注意,根本不会传递数组。在函数调用表达式中,与大多数上下文一样,数组值 "decay" 指向指针,并且这些指针按值传递。这会产生类似于但不完全相同的效果,如果数组是通过引用传递的话。

将其张贴在这里是因为我写它是为了进行代码审查并认为它值得保留:

在函数 声明 的 value-type 参数中添加 const 是没有用的。调用者不会关心参数是否被修改,因为调用者的数据不会受到任何影响。参数是一个不同于传入参数的单独对象,通过复制[或通过将右值参数移动到 move-constructible 参数(C++11 起)].

构造

将 const 添加到函数 definition 中的 value-type 参数,将单独的 function-local 对象标记为 const。这与标记局部变量'const'本质上是一样的,在确定value-type是否应该是const时,value-type参数通常应该被视为局部变量。

C 和 C++ 标准要求编译器和链接器足够智能,以便将以下声明与其定义相匹配:

// Declaration
void Foo(int bar);

// Definition
void Foo(const int bar){
 printf("%i", bar);
}