2009-02-12 72 views
12

我有以下代碼:空隙,VOID,C和C++

typedef void VOID; 
int f(void); 
int g(VOID); 

(使用gcc 4.3.2在Fedora 10),其編譯用C就好了。編譯爲C++相同的代碼給我下面的錯誤:

void.c:3: error: ‘<anonymous>’ has incomplete type 
void.c:3: error: invalid use of ‘VOID’ 

現在,這東西在外部庫,我想業主解決這個問題。所以我有一個問題 - C++標準禁止這種構造?你能給我一個指針/引文嗎?我能記得的唯一的事情是函數聲明(void)發信號給空的參數列表在C++中被棄用,但我不明白爲什麼typedefed VOID不起作用。

+0

值得一提的是,Visual C++ 2008沒有該代碼的問題。 – 2009-02-12 10:38:01

+4

在windows.h中它通常是一個定義`#define VOID void`。 – Ismael 2009-02-12 13:44:20

回答

17

是的,據我所知,第二個聲明在C++和C89中是無效的,但它在C99中是有效的。

從C99草案,TC2(6.7.5.3/10):

The special case of an unnamed parameter of type void as the only item in the list specifies that the function has no parameters.

它明確地講類型 「無效的」,而不是關鍵字。

從C++標準,8.3.5/2

If the parameter-declaration-clause is empty, the function takes no arguments. The parameter list (void) is equivalent to the empty parameter list.

這就意味着與「空隙」,而不是一般的類型「空隙」,也可以從其中一種情況下看到其中模板參數推導實際的關鍵字失敗(14.8.2/2):

  • Attempting to create a function type in which a parameter has a type of void.

它把別人清晰,顯着的一個核心語言問題報告here和其他的答案與一些GCC bug報告。


回顧一下,你的GCC是正確的,但早期的GCC版本是錯誤的。因此,該代碼可能已經成功編譯了。你應該修正你的代碼,以便它對這兩個函數都使用「void」,然後它將與其他編譯器一起編譯(comeau也會拒絕第二個聲明與「VOID」)。

0

我只是把你的代碼放在一個.cpp文件中,並且它在VS2005,SUSE,Redhat和Solaris中沒有問題編譯,所以我猜你的具體gcc版本不會批准這個。 Gal

18

gcc bug 。編輯:因爲它不夠清楚,我的意思是海灣合作委員會4.3.2編譯它由於錯誤。請參閱#32364#9278

+3

「gcc bugs」不是答案隊友 – 2015-04-27 13:17:58