2016-11-15 51 views
3

表示我的問題,一種玩具,代碼如下:需要一個 「多重定義」 一種變通方法錯誤

stuff.h:

#ifndef STUFF 
#define STUFF 

int a; 
int testarr[]={1,2,3}; 

#endif 

fcn.h:

#include "stuff.h" 
int b[]={5,6,7}; 
void fcn(); 

主.H:

#include "stuff.h" 
#include <stdio.h> 

fcn.c:

#include "main.h" 

void fcn() { 
    printf("Hello\n"); 
} 

main.c中:

#include "main.h" 
#include "fcn.h" 

int main() { 
    fcn(); 
    printf("HI\n"); 
} 

試圖編譯失敗:

/g/pe_19976/fcn_2.o:(.data+0x40): multiple definition of `testarr' 
/g/pe_19976/main_1.o:(.data+0x40): first defined here 

做一些閱讀後,我認識到限定在頭文件陣列testarr是問題。但事實是,在我的真實代碼中,有幾個文件需要訪問testarr,它需要在任何地方都有相同的賦值。我想我可以把它放在main.h(?),但即使這可以工作,在我的真實代碼中,它邏輯上屬於stuff.h。我如何解決這個難題?

順便說一句,基於我發現的其他東西,我試圖將testarr定義爲extern,但遇到同樣的問題。

回答

0

它爲什麼要使用這麼多的全局變量是不明確的。因爲有其包括相應的報頭的編譯單元(在示例中,有至少兩個編譯單元)陣列

int testarr[]={1,2,3}; 

被定義爲多次。

聲明在報頭陣列等

extern int testarr[3]; 

和CPP模塊中定義它。

int testarr[]={1,2,3}; 

對於具有外部鏈接的其他全局變量也是如此。

至於這句話

BTW,基於別的東西,我發現,我試圖定義testarr作爲 的extern,但得到了同樣的問題。

然後,帶有說明符extern的數組不應在頭中初始化。否則它是數組的定義。

3

當你把一個變量定義成一個頭文件,它包括將有變量的副本的任何.c文件。當您嘗試鏈接它們時,會出現多重定義錯誤。

你的頭文件應該只包含一個變量的聲明。這是使用extern關鍵字完成的,並且沒有初始值設定項。

然後在只有一個.c文件中,將定義一個可選的初始化一起。

例如:

main.c中:

#include "main.h" 
#include "fcn.h" 

int a; 
int testarr[]={1,2,3}; 

int main() { 
    fcn(); 
    printf("HI\n"); 
} 

stuff.h:

#ifndef STUFF 
#define STUFF 

extern int a; 
extern int testarr[]; 

#endif 

fcn.h:

#include "stuff.h" 
extern int b[]; 
void fcn(); 

fcn.c:

#include "main.h" 

int b[]={5,6,7}; 

void fcn() { 
    printf("Hello\n"); 
} 
相關問題