为什么Linker不抛出多个函数声明错误?

ove*_*nge 0 c linker function

以下是三个文件,

/* HANDLERS.H */
#define TRUE 1
#define FALSE 0

/* Functions  declarations - included in both UI.C & tiffhandler.c */
int canHandle(char *);
int drawImage(char *);
int saveFile(char *);
Run Code Online (Sandbox Code Playgroud)
/* tiffhandler.c */
#include "HANDLERS.H"

int canHandle(char *fileName){
    return TRUE;
}

int drawImage(char *fileName){
    return TRUE;
}

int saveFile(char *fileName){
    return TRUE; 
}
Run Code Online (Sandbox Code Playgroud)
/* UI.C */
#include "HANDLERS.H"
int main(void){
}
Run Code Online (Sandbox Code Playgroud)

编译为,

> gcc HANDLERS.H tiffhandler.c UI.C

我的问题,

HANDLERS.H包含在UI.C&tiffhandler.c.因此,函数声明包含在两者中.

在链接阶段,在tiffhandler.o&UI.o链接之前,为什么链接器不会抱怨,通过说,每个函数的多个函数声明(比如说canHandle)?

Rob*_*obᵩ 5

因为多个函数声明是完全合法的.只允许多个函数定义.

可以重复声明:

int canHandle(char *);
int canHandle(char *);
Run Code Online (Sandbox Code Playgroud)

但是以下是不正确的,因为它重复了一个定义:

int canHandle(char *fileName){
    return TRUE;
}

int canHandle(char *fileName){
    return TRUE;
}
Run Code Online (Sandbox Code Playgroud)

编译器(在单个翻译单元内)和链接器(跨多个翻译单元)强制禁止对同一功能的多个定义.