2016-03-07 172 views
2

如果我定義了一個簡單的數組:extern在C中聲明二維數組?

int tableint[][2] = { 
     {1, 2}, 
     {2, 4}, 
     {3, 9}, 
     {4, 16}, 
     {5, 25} 
}; 

和代碼在同樣的文件:

printf("Value = %d\n",sizeof(tableint)); 
printf("Value = %d\n",sizeof(tableint[0])); 
printf("Num of rows = %d\n",sizeof(tableint)/sizeof(tableint[0])); 

輸出爲預期:

Value = 40 
Value = 8 
Num of rows = 5 

但是,如果我移動相同在一個單獨的文件「tableint」 2D陣列和保持上述打印語句在先前的主文件,但只是增加一個外部如下:

extern int tableint[][2]; 

我在下面的行得到一個錯誤:

printf("Value = %d\n",sizeof(tableint)); 

爲:的 '的sizeof' 不完全型 'INT [] [2]'

我好奇無效的應用程序要知道爲什麼當二維數組在同一個文件中時,它的工作原理,而不是當我將它移動到另一個文件時?

而且,如果我定義的extern的錯誤得到解決:

extern int tableint[5][2]; 

有什麼辦法,我並不需要提及的行數在這裏的extern?

回答

4

以這種方式聲明的陣列 - 在聲明[] - 將有當且僅當聲明包含一個初始化完整的類型。沒有初始化器,類型不完整。

這就是你的區別,使得它在第一種情況下工作。

如果您確實需要將其聲明爲extern,那麼您只有明確指定所有大小,只要您需要此技術即可工作(或者只要您想將數組大小看作是常量表達式)。

如果您不在乎能否使用該技巧,並且如果您對將數組大小視爲運行時值感到滿意,則可以將該數組作爲另一個變量從該「單獨文件」中導出或作爲功能。

+0

還有其他選項,例如'extern tableint [] [2];'加上一些函數獲得的長度爲 –

+0

@ M.M .:是的,如果OP不介意失去把尺寸看作*常量表達式*的能力。 – AnT

+0

非常感謝! –

3

這是因爲C源文件作爲單獨的,個別翻譯單元處理,比可被編譯獨立於彼此(例如用gcc -c ...)。在關聯階段之前,存儲在某個單元中的信息對另一個單元是不可訪問的。

隨着中說,該規範是明確的,你不能拿sizeof運營商不完全類型,如N1570 6.5.3.4/1 sizeof運算和_Alignof運營商說:

sizeof經營者不得被施加到具有 函數類型或不完整的類型的表達式,這種 的括號名稱的類型,或者,指定的位字段構件的表達式。

+0

非常感謝! –