main()之前和之后的函数声明

时间:2019-05-04 15:33:16

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

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

  

第5行:警告:“ main”的返回类型不是“ int” [-Wmain] |

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

int add2nums( int, int);

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

int add2nums( int num1, int num2)

3 个答案:

答案 0 :(得分:2)

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

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

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

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

  1. 在调用它之前列出了整个函数
  2. 在调用函数之前,
  3. 具有函数签名的原型(aka前向引用)。在原型中,编​​译器仅需要返回的类型和参数的类型。但是,在原型中列出参数的名称是一种良好的编程习惯,以供阅读代码的人员使用。

答案 1 :(得分:1)

  1. 在C语言中,main函数具有签名int main(),该签名使您可以将值返回给OS,但是您制作的main()却没有{{1} }返回类型。因此,您得到了警告。
  2. void只是函数的声明,它使编译器可以引用该函数。那是因为编译器只读取一次文件。
  3. 不需要参数名称,因为它们不是签名的一部分。

答案 2 :(得分:1)

函数的声明是编译器的信息(不是链接程序,而是另一个答案),即函数的参数是什么类型,返回值是什么类型。

因此不需要参数名称。