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()
结束后再次使用参数 num1
和 num2
int add2nums( int num1, int num2)
- 在 C 语言中,
main
函数有一个签名 int main()
,它允许您将 return 一个值返回到 OS,但是您将 main()
没有 void
return 类型。因此你收到了警告。
int add2nums( int, int);
只是函数的声明,它让编译器引用该函数。那是因为编译器只读取文件一次。
- 不需要参数名称,因为它们不是签名的一部分。
函数的声明是编译器的信息(不是链接器,如另一个答案所述)——函数的参数是什么类型以及 return 值是什么类型。
所以不需要参数名称。
main()
函数有两个有效签名:
int main( void )
int main( int argc, char *argv[] )
请注意,两个有效签名的 return 类型都是 int
。任何其他 return 类型,例如 void
都是无效的,会导致编译器输出警告消息。
当代码调用函数时,编译器需要知道被调用函数的签名。有两种方法可以告诉编译器被调用函数的签名是什么:
- 在调用它的地方之前列出整个函数
- 在调用函数之前有一个函数签名的原型(又名前向引用)。在原型中,编译器只需要 returned 类型和参数类型。但是,将参数名称列在原型中是一种很好的编程习惯,以示对阅读代码的人的礼貌。
#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()
结束后再次使用参数 num1
和 num2
int add2nums( int num1, int num2)
- 在 C 语言中,
main
函数有一个签名int main()
,它允许您将 return 一个值返回到 OS,但是您将main()
没有void
return 类型。因此你收到了警告。 int add2nums( int, int);
只是函数的声明,它让编译器引用该函数。那是因为编译器只读取文件一次。- 不需要参数名称,因为它们不是签名的一部分。
函数的声明是编译器的信息(不是链接器,如另一个答案所述)——函数的参数是什么类型以及 return 值是什么类型。
所以不需要参数名称。
main()
函数有两个有效签名:
int main( void )
int main( int argc, char *argv[] )
请注意,两个有效签名的 return 类型都是 int
。任何其他 return 类型,例如 void
都是无效的,会导致编译器输出警告消息。
当代码调用函数时,编译器需要知道被调用函数的签名。有两种方法可以告诉编译器被调用函数的签名是什么:
- 在调用它的地方之前列出整个函数
- 在调用函数之前有一个函数签名的原型(又名前向引用)。在原型中,编译器只需要 returned 类型和参数类型。但是,将参数名称列在原型中是一种很好的编程习惯,以示对阅读代码的人的礼貌。