2013-04-09 81 views
1

我有一個gcc 4.3的奇怪問題,我想知道它是否是編譯器的特定問題,或者它是否是一個普通的C問題。當然,我使用了一個非常奇怪的構造,但我喜歡它,因爲它允許我執行一些否則將不可能的規則。 該項目分爲幾個模塊,每個模塊的結構都是不透明的。 在頭文件和1c文件中有typedef struct <tag> <type>聲明,存在struct tag { ... };,並且所有函數都通過<type> *引用元素。不透明結構數組指針

每個模塊都知道它自己的結構,其他模塊的結構是不可見的。在一個模塊中,我不使用1個元素,但使用固定的元素數組。這意味着該模塊的某些功能可以與指向數組的指針一起工作。 我們稱之爲模塊wdi。所以,我有例如

void write_all(wdi_type (*wdis)[MAX_WDI]); 

和分配(我知道很不尋常的語法),直接右指針返回到一個數組。

wdi_type (*wdi_alloc(void))[MAX_WDI]; 

這GNU-C 3.4.6(Solaris SPARC上)下工作很出色,在CC,它還會編譯陽光編譯器V12(無法雖然測試它,因爲應用程序中斷的另一部分)。 雖然在gcc 4.3.3(也在4.4.6 x86-64和4.6.2 ARM上測試過),但它沒有。我收到編譯錯誤array type has incomplete element type。 我不明白爲什麼編譯器會在這個階段需要這些信息。它不需要其他不透明結構的大小。

這是一個海灣合作委員會的錯誤?

標準說什麼?

我無法找到相關信息。我應該向GNU提交錯誤報告嗎?

回答

3

標準(良好,C2011標準的草案N1570)表示,在6.2.5(20)

數組類型描述了一種連續地分配非空的對象集與特定的成員對象類型,稱爲元素類型。 無論何時指定數組類型,元素類型都應該是完整的。

(由我強調)

在C99標準相應的通路較少有力:

數組類型描述與特定的成員對象類型一連續分配的非空的一組對象,稱爲元素類型。 36)

36)由於對象類型不包括不完全類型,無法構造不完全型的陣列。

它沒有明確禁止爲不完整的元素類型指定數組類型,只構造這樣一個數組。

我還沒有找到何時以及爲什麼腳註36被替換爲強調句子,但它在November 2010之前。

似乎gcc-4.x拒絕基於新版本的代碼,而gcc-3.4.6基於舊版本接受它,所以我不認爲它是一個錯誤,代碼根據現行標準明確無效。

+0

謝謝,這就是我的想法。我將不得不改變我的代碼。遺憾的是,通過使用普通的'wdi_type *'而不是'wdi_type(* wdis)[MAX_WDI]',編譯器丟失了一個用於類型檢查的信息,這樣做更加安全。 – 2013-04-10 05:53:27