一· 单文件
1 #include <stido.h>
2 //判断⼀年是不是闰年
3 int is_leap_year(int y)
4 {
5 if(((y%4==0)&&(y%100!=0)) || (y%400==0))
6 return 1;
7 else
8 return 0;
9 }
10 int main()
11 {
12 int y = 0;
13 scanf("%d", &y);
14 int r = is_leap_year(y);
15 if(r == 1)
16 printf("闰年\n");
17 else
18 printf("⾮闰年\n");
19 return 0;
20 }
上⾯代码中3~9行代码是函数的定义,14行是函数的调⽤。
这种场景下是函数的定义在函数调⽤之前,没啥问题。
那如果我们将函数的定义放在函数的调⽤后边,如下:
1 #include <stido.h> 2 int main() 3 { 4 int y = 0; 5 scanf("%d", &y); 6 int r = is_leap_year(y); 7 if(r == 1) 8 printf("闰年\n"); 9 else 10 printf("⾮闰年\n"); 11 return 0; 12 } 13 //判断⼀年是不是闰年 14 int is_leap_year(int y) 15 { 16 if(((y%4==0)&&(y%100!=0)) || (y%400==0)) 17 return 1; 18 else 19 return 0; 20 }
这样编译时候就会显示错误。
这是因为C语⾔编译器对源代码进⾏编译的时候,从第⼀⾏往下扫描的,当遇到第6⾏的is_leap_year 函数调⽤的时候,并没有发现前⾯有is_leap_year的定义,就报出了上述的警告。
把怎么解决这个问题呢?就是函数调⽤之前先声明⼀下is_leap_year这个函数,声明函数只要交代清 楚:函数名,函数的返回类型和函数的参数。
如:int is_leap_year(int y);这就是函数声明,函数声明中参数只保留类型,省略掉名字也是可以 的。
代码变成这样就能正常编译了。
#include <stido.h> int is_leap_year(int y);//函数声明 int main() { int y = 0; scanf("%d", &y); int r = is_leap_year(y); if(r == 1) printf("闰年\n"); else printf("⾮闰年\n"); return 0; } //判断⼀年是不是闰年 int is_leap_year(int y) { if(((y%4==0)&&(y%100!=0)) || (y%400==0)) return 1; else return 0; }
函数的调⽤⼀定要满意,先声明后使⽤; 函数的定义也是⼀种特殊的声明,所以如果函数定义放在调⽤之前也是可以的。
二· 多个文件
⼀般在工作中我们写代码时候,代码可能⽐较多,不会将所有的代码都放在⼀个⽂件中;我们往往会根据程序的功能,将代码拆分放在多个⽂件中。
⼀般情况下,函数的声明、类型的声明放在头⽂件(.h)中,函数的实现是放在原⽂件(.c)⽂件中。 如下:
add.c //函数的实现
//函数的定义 int Add(int x, int y) { return x+y; }
add.h //函数的声明
//函数的声明 int Add(int x, int y);
test.c 函数的逻辑
#include <stdio.h> #include "add.h" int main() { int a = 10; int b = 20; //函数调⽤ int c = Add(a, b); printf("%d\n", c); return 0; }
有了函数声明和函数定义的理解,我们写代码就更加⽅便了。