c - main() 前后的函数声明

标签 c function declaration

#include <stdio.h>

int add2nums( int, int);

void main(void)
{
  int y,a,b;

  printf("Enter 2 numbers\n");
  scanf("%d%d", &a, &b);

  y = add2nums(a,b);

  printf("a is %d\n", a);
  printf("b is %d\n", b);
  printf("y is %d\n", y);
}


int add2nums( int num1, int num2)
{
  int sum;
  sum = num1 + num2;
  return(sum);
}

所以通常,当我在 C 中创建新函数时,函数的定义是在 main() 函数之前创建的。

在我的讲座中,有一个关于如何创建函数原型(prototype)的示例,以及如何通过在 main() 函数之前声明它然后在 结束后定义它来创建它们>main() 函数。 运行上面的程序时,出现如下错误:

Line5: warning: return type of 'main' is not 'int' [-Wmain]|

发生了什么事?为什么函数 add2nums() 的声明在 main() 之前出现两次并且没有参数?

int add2nums( int, int);

然后在 main() 结束后再次使用参数 num1num2

int add2nums( int num1, int num2)

最佳答案

main() 函数有两个有效签名:

int main( void )
int main( int argc, char *argv[] )

请注意,两个有效签名的返回类型都是 int。任何其他返回类型,例如 void 都是无效的,会导致编译器输出警告消息。

当代码调用函数时,编译器需要知道被调用函数的签名。有两种方法可以告诉编译器被调用函数的签名是什么:

  1. 在调用函数之前列出整个函数
  2. 在调用函数之前有一个函数签名的原型(prototype)(又名前向引用)。在原型(prototype)中,编​​译器只需要返回的类型和参数的类型。但是,将参数名称列在原型(prototype)中是一种很好的编程习惯,以示对阅读代码的人的礼貌。

关于c - main() 前后的函数声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55984090/

相关文章:

c - GNU C 库中的三角函数是如何测试的?

c++ - sprintf 未定义行为

Javascript:缓存的函数属性与新值

arrays - 将多维数组传递给函数

c - sprintf 转换在格式末尾缺少类型

c++ - 在 cmake 中,cmake 文件夹和 CMakeLists.txt 可以放在不同的文件夹中吗?

PHP函数根据输入获得相同的输出

c - 以下 C 中的声明之间有什么区别?

c++ - 在C++中错误地像array [1-00]那样声明了数组,但是代码仍然有效,输出不正确?

c++ - 错误 C2065 : 'resultImgs' : undeclared identifier