Existe uma diferença entre foo(void) e foo() em C++ ou C?
Pergunta
Considere estas duas definições de função:
void foo() { }
void foo(void) { }
Existe alguma diferença entre esses dois?Se não, por que o void
argumento aí?Razões estéticas?
Solução
Em C:
void foo()
significa "uma funçãofoo
pegando um número não especificado de argumentos de tipo não especificado"void foo(void)
significa "uma funçãofoo
sem aceitar argumentos"
Em C++:
void foo()
significa "uma funçãofoo
sem aceitar argumentos"void foo(void)
significa "uma funçãofoo
sem aceitar argumentos"
Por escrito foo(void)
, portanto, alcançamos a mesma interpretação em ambos os idiomas e tornamos nossos cabeçalhos multilíngues (embora geralmente precisemos fazer mais algumas coisas nos cabeçalhos para torná-los verdadeiramente multilíngues;ou seja, embrulhe-os em um extern "C"
se estivermos compilando C++).
Outras dicas
Sei que sua pergunta se refere a C++, mas quando se trata de C a resposta pode ser encontrada em K&R, páginas 72-73:
Além disso, se uma declaração de função não incluir argumentos, como em
double atof();
Isso também é considerado que nada deve ser assumido sobre os argumentos de ATOF;toda a verificação de parâmetros está desativada.Esse significado especial da lista de argumentos vazios destina -se a permitir que os programas C mais antigos compilem com novos compiladores.Mas é uma má ideia usá -lo com novos programas.Se a função aceitar argumentos, declare-os;Se não for argumentos, use o vazio.
Rascunho do padrão C++ 11 N3337
Não há diferença.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
Anexo C "Compatibilidade" C.1.7 Cláusula 8:declaradores diz:
8.3.5 Alteração:Em C++, uma função declarada com uma lista de parâmetros vazia não aceita argumentos.Em C, uma lista de parâmetros vazios significa que o número e o tipo de argumentos de função são desconhecidos.
Exemplo:
int f(); // means int f(void) in C ++ // int f( unknown ) in C
Justificativa:Isso é para evitar chamadas de função errôneas (ou seja, chamadas de função com o número errado ou tipo de argumentos).
Efeito no recurso original:Mudança para semântica de recurso bem definido.Esta característica foi marcada como “obsoleta” em C.
8.5.3 funções diz:
4.A cláusula de parâmetro-deClaração determina os argumentos que podem ser especificados e seu processamento, quando a função é chamada....] Se a cláusula de declarações de parâmetro estiver vazia, a função não leva argumentos.A lista de parâmetros (void) é equivalente à lista de parâmetros vazia.
Capítulo 99
Conforme mencionado pelo C++ 11, int f()
não especifica nada sobre os argumentos e é obsoleto.
Isso pode levar a um código funcional ou UB.
Interpretei o padrão C99 detalhadamente em: https://stackoverflow.com/a/36292431/895245
Em C, você usa um void em uma referência de função vazia para que o compilador tenha um protótipo, e esse protótipo "não tenha argumentos".Em C++, você não precisa informar ao compilador que possui um protótipo porque não pode omitir o protótipo.