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

时间:2016-11-03 15:30:33

标签: c function linker

以下是三个文件,

/* 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 *);
/* tiffhandler.c */
#include "HANDLERS.H"

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

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

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

编译为,

  

> gcc HANDLERS.H tiffhandler.c UI.C

我的问题,

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

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

2 个答案:

答案 0 :(得分:5)

因为多个函数声明是完全合法的。不允许使用多个函数定义。

可以重复声明:

int canHandle(char *);
int canHandle(char *);

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

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

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

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

答案 1 :(得分:1)

如果编译单元中有多个函数 definitions ,链接器将只会失败。所以即使以下内容在文件中也可以:

void func(void);
void func(void);
void func(void);