我知道可以在没有参数的情况下声明函数原型。而且我没有看到在我的代码中使用它们有任何好处。
关于在函数原型中使用参数有什么流行的建议吗?
是的,这就是声明函数的意义所在。函数声明(原型)应该描述函数的作用(有一个好名字)以及它需要做什么(参数),而不需要查看函数内部的实际代码。
如果我们谈论的是 C,你就不能真正声明一个函数而不声明它的参数(如果有的话),除非你谈论的是可变参数,这是一个非常小众的话题。
最重要的是告诉编译器函数的返回类型是什么以及它采用什么类型的参数。如果您不这样做,编译器会认为它们具有
int
类型,这可能会导致未定义的行为。通常always使用函数原型。
声明带有原型的函数的主要目的是指定其参数的类型。这允许编译器检查函数调用中的一些错误,例如在为函数参数声明指向某种其他类型对象的指针时错误地将指针传递给一种结构类型。尽早发现错误是软件工程的重要组成部分。
一个小的好处是将参数转换为参数类型。例如,假设一个函数
foo
在其源代码中定义了一个 double
参数。如果在头文件中可见的声明是 void foo();
,而我们想传递一个 k
是一个 int
,那么我们必须写 foo((double) k)
或等价物。但是,如果可见声明是void foo(double);
,那么我们可以写foo(k)
,k
会自动转换成double
。
注意C标准中使用的术语:
A 函数原型 是声明其参数类型的函数的声明,根据 C 2018 6.2.1 2。C 标准目前允许没有参数类型的函数声明,例如:
void foo(); // Says nothing about what the parameters are.
或者带参数类型,比如:
void foo(int, char); // Says the function has an `int` parameter and a `char` parameter.
函数原型还可以包含参数的名称:
void foo(int x, char y);
在不是定义(不提供函数体)的函数声明中,参数名称的作用无非是为人类读者提供有关参数用途的线索。在函数定义中,需要名称以便可以在函数内部引用参数。
此外,C 标准使用 argument 表示在函数调用中传递给函数的表达式,如 C 2018 3.3 中所定义。 parameter 是函数的参数值副本,如 C 2018 3.16.
中所定义是的,当然可以声明不带参数的函数原型。
如果你还活在七十年代
最初的 C 编译器是简陋的装置,以能够成功编译几乎所有你扔给它们的文本而闻名;您将获得的运行时结果是一个完全不同的故事。主要是段错误。
一旦语言变得流行,编译器就开始支持这个叫做warnings的奇妙功能。编译器供应商仍然对它们不安全,因此它们默认情况下未启用,但至少如果您知道正确的 magical-incantations 编译器命令行参数,您可以启用它们。
早在 90 年代,当我在大学时,我们试图在没有警告的情况下使用 ANSI C 进行编程,因为我们的教授从未告诉我们任何有关警告的好处或如何启用警告的信息。大学毕业后,在工作中,我记得同事们在没有启用警告的情况下用 C 编写代码,因为他们相信他们比编译器更了解。这会导致像这样的可怕错误:michael.gr - 所有错误之母
从那时起,我们的行业有了长足的进步。警告被认为是有益的。不,你并不比编译器更了解。你是一个人。你犯错误。这是既定事实。启用编译器必须提供给您的所有警告。
如果您启用了所有警告,那么编译器将不允许您省略参数。