void, VOID, C e C ++

Eu tenho o seguinte código:

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

que compila muito bem em C (usando o gcc 4.3.2 no Fedora 10). O mesmo código compilado como C ++ me dá o seguinte erro:

 void.c:3: error: '' has incomplete type void.c:3: error: invalid use of 'VOID' 

Agora, isso é algo na biblioteca externa e gostaria que o proprietário corrigisse esse problema. Então eu tenho uma pergunta – o padrão C ++ proíbe essa construção? Você poderia me dar um ponteiro / citação? A única coisa que me lembro é que a declaração de function com (void) para sinalizar a lista de parâmetros vazia está obsoleta em C ++, mas não entendo porque o VOID com typedefed não funciona.

Sim, até onde sei, a segunda declaração é inválida em C ++ e C89, mas é válida em C99.

Do esboço do C99, TC2 ( 6.7.5.3/10 ):

O caso especial de um parâmetro sem nome do tipo void como o único item na lista especifica que a function não possui parâmetros.

É explicitamente falando sobre o tipo “void”, não a palavra-chave.

Do padrão C ++, 8.3.5/2 :

Se a cláusula de declaração de parâmetro estiver vazia, a function não recebe argumentos. A lista de parâmetros (void) é equivalente à lista de parâmetros vazia.

Isso significa que a palavra-chave real com “void”, e não o tipo geral “void”, também pode ser vista em um dos casos em que a dedução do argumento de modelo falha ( 14.8.2/2 ):

  • Tentativa de criar um tipo de function no qual um parâmetro possui um tipo de vazio.

É claro por outros, notável em um relatório de problema de idioma central aqui e alguns relatórios de reclamações do GCC ligados por outras respostas.


Para recapitular, seu GCC está certo, mas versões anteriores do GCC estavam erradas. Assim, esse código pode ter sido compilado com êxito anteriormente. Você deve consertar seu código, para que ele use “void” para ambas as funções, então ele irá compilar também com outros compiladores (comeau também rejeita a segunda declaração com esse “VOID”).

erros do gcc . Edit: uma vez que não estava claro o suficiente, o que eu quis dizer foi que o gcc 4.3.2 estava compilando devido a erros. Veja # 32364 e # 9278 .

Eu apenas coloquei seu código em um arquivo .cpp, e ele compilou sem problemas no VS2005, SUSE, Redhat e Solaris, então eu acho que sua versão específica do gcc não aprova isso. Gal