[英]void, VOID, C and C++
我有以下代碼:
typedef void VOID;
int f(void);
int g(VOID);
它在C中編譯得很好(在Fedora 10上使用gcc 4.3.2)。 編譯為C ++的相同代碼給出了以下錯誤:
void.c:3: error: ‘<anonymous>’ has incomplete type
void.c:3: error: invalid use of ‘VOID’
現在,這是外部庫中的東西,我希望所有者解決這個問題。 所以我有一個問題 - C ++標准是否禁止這種結構? 你能給我一個指針/引文嗎? 我唯一記得的是在C ++中不推薦用函數聲明(void)來表示空參數列表,但我不明白為什么typedefed VOID不起作用。
是的,據我所知,第二個聲明在C ++和C89中無效,但它在C99中有效。
來自C99草案,TC2( 6.7.5.3/10
):
void類型的未命名參數作為列表中唯一項的特殊情況表明該函數沒有參數。
它明確地談論類型“void”,而不是關鍵字。
來自C ++標准, 8.3.5/2
:
如果parameter-declaration-clause為空,則該函數不帶參數。 參數列表
(void)
等效於空參數列表。
這意味着具有“void”的實際關鍵字,而不是通用類型“void”也可以從模板參數推斷失敗的情況( 14.8.2/2
)中看出:
- 試圖創建一個函數類型,其中參數的類型為void。
其他人已經明確了這一點, 這里有一個核心語言問題報告,還有一些與其他答案相關的GCC錯誤報告。
總結一下,你的海灣合作委員會是正確的,但早期的GCC版本是錯誤的。 因此,該代碼可能已經使用它成功編譯。 你應該修復你的代碼,以便它對兩個函數都使用“void”,然后它也將與其他編譯器一起編譯(comeau也拒絕使用那個“VOID”的第二個聲明)。
我只是把你的代碼放在一個.cpp文件中,它在VS2005,SUSE,Redhat和Solaris中沒有問題編譯,所以我猜你的具體gcc版本不贊成這個。 加爾
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.