2012-11-19 21 views
4

我有一個代碼片段(舊代碼),它具有類似於下面的代碼:宣告無效參數列表與一個typedef是非標準

typedef void SPECIAL_VOID; 
int func (SPECIAL_VOID) 
{ 
    ..... 
} 

GCC拋出以下警告的這一段代碼: 警告:#494-d:宣告無效參數列表與一個typedef是非標準

爲什麼GCC抱怨,爲什麼是這樣的非標準?

回答

5

這C89和C99之間變化。

C89具有:(6.5.4.3):

甲參數類型列表指定類型,並且可以宣告 標識符,該函數的參數。 [...]的void在列表中唯一項目的 特殊情況規定了 函數沒有參數。

在C99此被改變爲(6.7.5.3p10;在C11 6.7.6.3p10):

void類型的未命名參數的特殊情況如在列表指定的唯一項該函數沒有參數。

這是偶爾認爲是指,在C89,聲明一個0參數功能時,而在C99一個typedef僅允許文字令牌void(後預處理)是可接受的。然而,這不是標準的根據defect report 157意圖:指示一個

子條款6.7.1明確指出,它是具有式void(相對於使用void關鍵字的)一個單一的參數函數不帶參數。 爲了清楚起見,應該改寫6.5.4.3以強調它是void的類型,而不是關鍵字void

對於C++,defect 577使C++符合C99;該決議不在C++ 11中出現,但是存在於標準草案n3376中,因此可以假定存在於下一個版本的標準中,並且可能在第一個TC到C++ 11中。出於明顯的原因,到void的typedef不能依賴於模板參數。問題G++ error: ‘<anonymous>’ has incomplete type用g ++討論了這個問題,並指出g ++可能會繼續拒絕代碼。

相關問題