以下是三个文件,
/* 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
)?
答案 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);