定义在当前翻译单元(一般是.c文件包含了头文件之后的结果)外,以extern前缀声明的函数对于当前翻译单元来说是外部函数。它提示编译器,假定这个函数的定义存在,但不在当前翻译单元中。因此若语法正确,编译器不对此函数产生标识符未定义的错误。链接器会检查编译器得到的若干目标文件以及静态库文件中的包括函数在内的符号,如果不满足唯一定义性则产生错误,链接失败,不会产生最终目标文件(如.exe可执行文件)。
对于加static前缀声明的函数,编译器认为定义在当前翻译单元或库中且不会被其它翻译单元引用(也就是说函数仅对当前源文件有效)。相对于extern(外部)函数,这些函数可以称为internal(内部)函数。
而不加extern或static声明的函数,默认为定义在当前翻译单元中,且其它翻译单元可以用extern函数声明引用这个函数(对链接器可见)。
对于非extern函数,如果编译器在当前翻译单元中找不到函数的定义,则产生标识符未定义的编译错误,编译失败。
====
[原创回答团]