2010-06-18 52 views
21

我有一個文件,並在另一個我不得不使用它定義了一個數組,對EG-數組的外部延遲?

/* a.c - defines an array */ 

int a[] = {1,2,3,4,5,6,7,8,9}; 


/* b.c - declare and use it. */ 

#define COUNT ((sizeof a)/(sizeof int)) 
extern int a[]; //size of array 

. 
. 
. 

int i; 
for(i=0; i<COUNT; i++) 
    printf("%d", a[i]); 
. 
. 
. 

現在,當我嘗試編譯它,它給我的錯誤,說的sizeof水溼不完整的使用類型。

有人可以告訴我如何在C/C++中處理這種情況?我不想數組下標在交流轉換器提前

+0

今天我遇到了這個問題。我認爲如果鏈接器可以解析外部對象的引用,那麼它也可以解析它們的大小......但是看起來鏈接器並不那麼聰明...... – Calmarius 2013-12-18 19:40:48

回答

20

感謝你可能把類似下面進入a.c,然後從b.c它的extern。

在交流轉換器:

int a[] = {1, 2, 3}; 
const int lengthofa = sizeof(a)/sizeof(a[0]); 

然後在b.c:

extern int a[]; 
// the extern (thanks Tim Post) declaration means the actual storage is in another 
// module and fixed up at link time. The const (thanks Jens Gustedt) prevents it 
// from being modified at runtime (and thus rendering it incorrect). 
extern const int lengthofa; 

void somefunc() { 
    int i; 
    for (i = 0; i < lengthofa; i++) 
    printf("%d\n", a[i]); 
} 
0

編譯器在編譯時b.c確定數組的大小沒有足夠的信息。該信息僅在a.c中的初始化程序列表在範圍內。

您必須以某種方式溝通大小。一種方法是用大小和外部參數來定義一個int常量。另一種可能性是使用標記(有效數據範圍外的值)來指示數組的結束。

0

在我看來,如果你沒有定義並且在一個文件中用sizeof定義它不能編譯。

文件被編譯並存儲爲* .obj/* .a文件。你可以使用來自其他文件的數組感謝extern聲明,這將在編譯後在鏈接過程中檢查。

你想聲明define(preprocesor必須在這裏幫忙,它在編譯之前運行)。

所以在編譯之前,你不會從另一個文件獲得陣列...

8

如果你希望你的數組的大小是恆定的訪問作爲一個編譯時間,那麼你就沒有別的選擇,只能指定數組大小明確在extern聲明數組

extern int a[9]; 

在這種情況下它成爲你的責任,以確保數組大小是extern聲明和定義保持一致。您可以爲此使用清單常量,但仍然有責任確保{}與聲明大小之間的初始值設定項數目相同。

如果你不關心將數組大小作爲編譯時常量,那麼你可以做Mark Wilkins在他的答案中提出的建議。

0

我會#define ARRAY_MAX (or whatever)在通常用於定義這種事情的外部頭,然後將這個頭包含在兩個需要它的文件中。當您傾向於將大部分(如果不是全部)define保留在一個或兩個中央標題中時,這種方法效果很好。