初学者常常有这样一个疑惑:头文件(.h文件)和源文件(.c文件)是不是存在一种特定的对应,比如必须有相同的文件名(不考虑后缀不同)等等。
实际上头文件和源文件可以没有任何对应关系,比如以定义和使用一个求和函数为例,函数可以分为两部分:函数声明和函数定义。
函数声明:
int sum(int a, int b);
函数定义:
int sum(int a, int b)
{
return a + b;
}
编译器要求在 sum函数被调用的代码行之前,在源文件中能找到sum函数的声明或定义就可以。这个sum函数的函数声明或者函数定义可以和函数的调用代码在同一个源文件,或者不在同一个源文件(通过#include包含进来)。如果编译器找到的仅仅是函数声明,那么还要在其他文件中找到函数定义。所以大致存在如下几种情况:
情况1: 只有函数定义,和调用代码行在同一个源文件中,并且在调用代码行之前。如myapp.c中包含以下代码:
#include <stdio.h>
int sum(int a, int b)
{
return a + b;
}
int main()
{
int x = 1;
int y = 3;
int s = sum(x, y);
printf("sum:%d", s);
}
情况2: 有函数声明和函数定义,和调用代码行在同一个源文件中。并且在调用代码行之前。如myapp.c中包含以下代码:
#include <stdio.h>
int sum(int a, int b);
int sum(int a, int b)
{
return a + b;
}
int main()
{
int x = 1;
int y = 3;
int s = sum(x, y);
printf("sum:%d", s);
}
情况3: 有函数声明和函数定义,和调用代码行在同一个源文件中。并且函数声明在调用代码行之前,函数定义在调用代码行之后。如myapp.c中包含以下代码:
#include <stdio.h>
int sum(int a, int b);
int main()
{
int x = 1;
int y = 3;
int s = sum(x, y);
printf("sum:%d", s);
}
int sum(int a, int b)
{
return a + b;
}
情况4: 有函数声明和函数定义。函数声明和调用代码行在同一个源文件中,并且在调用代码行之前。函数定义在另外一个源文件中。如myapp.c中包含以下代码:
#include <stdio.h>
int sum(int a, int b);
int main()
{
int x = 1;
int y = 3;
int s = sum(x, y);
printf("sum:%d", s);
}
math.c中包含以下代码:
int sum(int a, int b)
{
return a + b;
}
情况5: 有函数声明和函数定义。函数声明不和调用代码行在同一个源文件中,而是在一个头文件中。函数定义在另外一个源文件中。如myapp.c中包含以下代码:
#include <stdio.h>
#include "math.h"
int main()
{
int x = 1;
int y = 3;
int s = sum(x, y);
printf("sum:%d", s);
}
math.h中包含以下代码:
#ifndef COMMONS_H_
#define COMMONS_H_
int sum(int a, int b);
#endif /* COMMONS_H_ */
math.c中包含以下代码:
int sum(int a, int b)
{
return a + b;
}
情况6: 有函数声明和函数定义。函数声明不和调用代码行在同一个源文件中,而是在一个头文件中。函数定义在同一个头文件中。如myapp.c中包含以下代码:
#include <stdio.h>
#include "math.h"
int main()
{
int x = 1;
int y = 3;
int s = sum(x, y);
printf("sum:%d", s);
}
math.h中包含以下代码:
#ifndef COMMONS_H_
#define COMMONS_H_
int sum(int a, int b);
int sum(int a, int b)
{
return a + b;
}
#endif /* COMMONS_H_ */
情况7: 只有函数定义,没有函数声明。函数定义不和调用代码行在同一个源文件中,而是在一个头文件中。如myapp.c中包含以下代码:
#include <stdio.h>
#include "math.h"
int main()
{
int x = 1;
int y = 3;
int s = sum(x, y);
printf("sum:%d", s);
}
math.h中包含以下代码:
#ifndef COMMONS_H_
#define COMMONS_H_
int sum(int a, int b)
{
return a + b;
}
#endif /* COMMONS_H_ */
推荐阅读:看到知乎上一篇文章很好的说明了头文件应该怎么组织,可以进一步阅读,【C语言精华】头文件组织与包含原则!纯干货,这是一篇有价值的文章! - 知乎