我有两个单元的简单程序:
count_words.c:
int main( int argc, char ** argv )
{
printf("starting\n");
int i = aaa(55555);
printf("%d",i);
printf("ending\n");
return i;
}
clean.c:
int aaa(int i)
{
printf("aaa\n");
return 5;
}
生成文件:
count_words: clean.o count_words.o -lfl
gcc count_words.o clean.o -lfl -ocount_words
%.o:%.c
gcc -c -o $@ $<
程序构建正常并运行,但在count_words.c
我没有包含来自int aaa(int)
的函数clean.c
声明的头文件。为什么我需要有头文件,因为没有它们编译程序没问题?
答案 0 :(得分:1)
头文件通常包含用作前向声明的函数声明。如果没有函数转发声明,则对函数的任何调用都被视为函数的隐式声明。
在C99
标准之后,函数的隐式声明已经变为非标准。编译器可能支持遗留代码支持,但不保证将来会这样做。
所以最重要的是,你需要在每个源文件中都有函数声明。使用头文件时,我们可以使用每个源文件的所有前向声明和一个包含语句,我们可以将它们全部包含在每个源中。
因此,从可用性的角度来看,当您包含头文件时,不需要在每个源文件中重复单个声明。这支持DRY principle,所以很好。