在C函数原型中输入参数的名称?

在C函数原型中输入参数的名称?,c,function-prototypes,C,Function Prototypes,在C中声明函数时,应该设置一个原型,不需要在其中写入参数名称。仅凭它的类型就足够了 void foo(int, char); 我的问题是,还包括参数的名称是一种好的做法吗?是的,甚至在原型中命名参数也是一种好的做法 您通常将所有原型都放在头文件中,并且头文件可能是您的用户唯一可以检查的东西。因此,拥有有意义的参数名称是API的第一级文档 同样,关于函数的功能(当然不是如何实现它们)的注释应该与它们的原型一起放在标题中 编写良好的头文件可能是库中最重要的部分 奇怪的是,参数的恒定性是

在C中声明函数时,应该设置一个原型,不需要在其中写入参数名称。仅凭它的类型就足够了

     void foo(int, char);

我的问题是,还包括参数的名称是一种好的做法吗?

是的,甚至在原型中命名参数也是一种好的做法

您通常将所有原型都放在头文件中,并且头文件可能是您的用户唯一可以检查的东西。因此,拥有有意义的参数名称是API的第一级文档

同样,关于函数的功能(当然不是如何实现它们)的注释应该与它们的原型一起放在标题中

编写良好的头文件可能是库中最重要的部分


奇怪的是,参数的恒定性是一个实现细节。因此,如果在实现中没有对参数变量进行变异,则只在实现中放入
const

/* Header file */

/* Computes a thingamajig with given base
 * in the given number of steps.
 * Returns half the thingamajig, or -1 on error.
 */
int super_compute(int base, int steps); 


我绝对建议包含参数的名称。如果您正在编写一个库,那么对于那些将使用您的库的人来说,能够从头文件中的原型中收集函数的功能是非常有用的。例如,考虑<代码> MeMCPY < /代码>。如果没有参数的名称,您将无法知道哪个是源,哪个是目标。最后,将函数定义复制到原型中时,包含名称比删除名称更容易。如果保留名称,只需在末尾添加分号。

一些IDE和编辑器将从头文件中提取原型信息,并在键入时提供参数信息作为提示。如果名称可用,这有助于更快地编写代码(并有助于避免一些bug)。

我认为C需要参数名称(不过我不知道C99)。也许你在考虑C++。@马塞洛坎托斯:不,C不需要它们;更好的是,C标准甚至允许您留下一个空参数列表,这意味着没有给出有关参数的信息(C99,§6.7.5.3,^14);与C++相比,这意味着函数不接受任何参数。@ WTP:这是一个具有讽刺意味的“更好”:即使是标准(1),也就是说:“使用具有空括号的函数声明符(不是原型格式参数类型声明符)是过时的特征。”因为它完全违背了原型的部分目的。@MatteoItalia:我刚刚意识到我混淆了声明和定义。定义需要C -而不是C++中的参数名,但上面的声明也有效。为什么您要拒绝仅看到头文件的客户端的常态知识?@ DaviHeffeln:参数是通过值传递的,因此,用户无法处理这些信息。@Kerrek SB autocomplete意味着当您键入函数或变量名的一部分时,编辑器可以自动将其扩展到完整符号。这类似于谷歌的自动完成功能。在原型中使用参数名的优点是,编辑器可以插入占位符,您可以通过制表符查看占位符,这些占位符对程序员来说是有意义的。仅仅使用“int”或“char*”并不能描述这个参数是关于什么的。如果一个函数有许多参数,并且您不想每次都查看文档,这一点尤其有用。
int(int,int)
int(const int,int)
是不兼容的类型(C99 6.7.5.3§15:两种函数类型兼容[…]相应参数应具有兼容类型,C99 6.7.3§9:对于要兼容的两个合格类型,两个参数应具有兼容类型的相同合格版本),使该行为未定义;可移植的解决方法:保持头文件中的声明不变,并将定义中的参数重命名为
base\
,然后添加
const int base=base\到函数体[我最终得出结论,这在C和C++中都是完全正确的。]不是<代码> MeMCPY < /C>参数:指向const的指针,而另一个是指向可变的指针?这有点泄露了…@Kerrek,你说得对。我忘记了常量。它显示了我有多大。。。也许
atan2
是一个更好的例子。
/* implementation file */

#include "theheader.h"

int super_compute(const int base, int steps)
{
  int b = 2 * base;
  while (--steps) { b /= 8; } /* no need for a local variable :-) */
  return -1;
}