main() 前后的函数声明

Function declaration before and after main()

#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() 函数之前创建的。

在我的讲座中,有一个关于如何创建函数原型的示例,以及如何通过在 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)
  1. 在 C 语言中,main 函数有一个签名 int main(),它允许您将 return 一个值返回到 OS,但是您将 main() 没有 void return 类型。因此你收到了警告。
  2. int add2nums( int, int); 只是函数的声明,它让编译器引用该函数。那是因为编译器只读取文件一次。
  3. 不需要参数名称,因为它们不是签名的一部分。

函数的声明是编译器的信息(不是链接器,如另一个答案所述)——函数的参数是什么类型以及 return 值是什么类型。

所以不需要参数名称。

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

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

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

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

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