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?

Foi útil?

Solução

Em C:

  • void foo() significa "uma função foo pegando um número não especificado de argumentos de tipo não especificado"
  • void foo(void) significa "uma função foo sem aceitar argumentos"

Em C++:

  • void foo() significa "uma função foo sem aceitar argumentos"
  • void foo(void) significa "uma função foo 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top