2016-11-03 12 views
0

次はリンカーがスローしない理由、複数の関数宣言エラー?

> gccのHANDLERS.Hのtiffhandler.cのUI、としてコンパイルされている3つのファイル、

/* 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){ 
} 

です。 C

私の質問は、

HANDLERS.Hは両方UI.C & tiffhandler.cに含まれています。したがって、関数宣言は両方に含まれています。

相をリンク時tiffhandler.o & UI.oがリンクされる前に、なぜリンカは(canHandleを言う)、各機能のために複数の関数宣言を言って、文句を言わないのですか?

答えて

5

複数の関数宣言は完全に合法であるためです。複数の関数定義のみが許可されません。

宣言を繰り返しても大丈夫です。

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

しかし、それは定義を繰り返しているので、次は正しくありません。

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

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

同じ機能の複数の定義の禁止は両方によって強制されますコンパイラ(1つの翻訳単位内)とリンカ(複数の翻訳単位間)を使用します。

1

コンパイル単位に複数の関数の定義がある場合にのみ、リンカーは失敗します。だから次のファイルでもOKです:

void func(void); 
void func(void); 
void func(void); 
関連する問題