c语言源程序要不要包孕自己的头文件

c语言源程序要不要包含自己的头文件
比如a.c里是一个延迟函数void delay(){};为了让其他文件调用,写一个a.h头文件extern void delay();
那么a.c里要不要写#include "a.h" 我看到好多例子都写了,都不写好像编译也没事,谁解释下这是怎么回事,到底要不要写。为什么头文件的源程序还要包含自己的头文件呢?谢谢各位?
C

------解决方案--------------------
检查函数声明和实现的参数和返回值是否一致。只是建议而已。
------解决方案--------------------
void delay(...)
{
...
}
void other(...)
{
  delay(...); // ok
}


void other(...)
{
  delay(...); // 不好,应该声明原型
}
void delay(...)
{
...
}

其实纠结这个意义不大,反正重复声明无害,一般都统一加上
什么时候.h里不想包含.c里定义的函数的声明?语义上说,.h声明接口,对实现函数,应该不声明。实现函数是指,除.c里的函数外,你不想让任何其他程序使用这个函数,那接口就应该隐藏起来。当然为了严密,最好把这样的函数直接加个static,禁止外部使用