【问题标题】:Put name of parameters in C function prototypes?将参数名称放在C函数原型中?
【发布时间】:2011-12-31 18:32:06
【问题描述】:

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

     void foo(int, char);

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

【问题讨论】:

  • 我认为 C 需要参数名称(不过我不了解 C99)。也许您正在考虑 C++。
  • @MarceloCantos:不,C 不需要它们;更好的是,C 标准甚至允许您留下一个空的参数列表,这意味着没有给出有关参数的信息(C99,§6.7.5.3,¶14);将此与 C++ 进行对比,这意味着该函数不接受任何参数。
  • @WTP:这是一个具有讽刺意味的“更好” :) 甚至标准说(§6.11.6 ¶1)“使用带空括号的函数声明符(不是原型格式参数类型声明符) 是一个过时的功能。”,因为它完全违背了原型的部分目的。
  • @MatteoItalia:我刚刚意识到我混淆了声明和定义。 定义需要 C 中的参数名称——而不是 C++——但上面的声明在任何一个中都有效。

标签: c function-prototypes


【解决方案1】:

是的,即使在原型中命名参数也是一种很好的做法。

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

同样,关于函数做什么(当然不是它们如何实现)的 cmets 应该连同它们的原型一起放在标题中。

一个写得很好的头文件可能是你库中最重要的部分!


奇怪的是,参数的常量性是一个实现细节。因此,如果您在实现中不改变参数变量,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); 

/* 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;
}

【讨论】:

  • 为什么要拒​​绝只看到头文件的客户端知道常量?
  • @DavidHeffernan:参数是按值传递的,因此用户无法处理这些信息。
  • @Kerrek SB 自动完成意味着当您输入函数或变量名称的一部分时,您的编辑器可以自动将其扩展为完整的符号。这类似于 Google 的自动完成功能。在原型中使用参数名称的好处是编辑器可以插入占位符,您可以通过 Tab 浏览,这些占位符对程序员来说是有意义的。仅具有“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++ 中这确实完全没问题。]
【解决方案2】:

我绝对建议包括参数的名称。如果您正在编写一个库,那么对于那些将使用您的库的人来说,能够从头文件中的原型中收集函数的功能肯定很有用。以memcpy 为例。如果没有参数的名称,您将不知道哪个是源哪个是目标。最后,当您复制函数定义以使其成为原型时,包含名称比删除它们更容易。如果保留名称,只需在末尾添加分号即可。

【讨论】:

  • memcpy 参数中的一个不是指向常量的指针,而另一个不是指向可变的指针吗?那种给人的感觉......
  • @Kerrek,你是对的。我忘了const。它显示了我的年龄......也许atan2 是一个更好的例子。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 2011-07-11
    相关资源
    最近更新 更多