Existe uma diferença entre foo (void) e foo () em C ++ ou C?

Considere estas duas definições de function:

void foo() { } void foo(void) { } 

Existe alguma diferença entre esses dois? Se não, por que o argumento void aí? Razões estéticas?

Em C :

  • void foo() significa “uma function para pegar um número não especificado de argumentos de tipo não especificado”
  • void foo(void) significa “uma function que não foo argumentos”

Em C ++ :

  • void foo() significa “uma function que não foo argumentos”
  • void foo(void) significa “uma function que não foo argumentos”

Ao escrever foo(void) , portanto, alcançamos a mesma interpretação em ambas as linguagens e tornamos nossos headers multilíngües (embora geralmente precisemos fazer mais algumas coisas nos headers para torná-los verdadeiramente uma linguagem cruzada, ou seja, envolvê-los em um extern "C" se estivermos compilando o C ++).

Eu percebo que sua pergunta pertence ao 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 function não include argumentos, como em

 double atof(); 

isso também é usado para significar que nada deve ser assumido sobre os argumentos de uma vez; toda a verificação de parâmetros está desativada. Esse significado especial da lista de argumentos vazios destina-se a permitir que programas C mais antigos compilem com novos compiladores. Mas é uma má ideia usá-lo com novos programas. Se a function receber argumentos, declare-os; se não receber argumentos, use void.

Esboço 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 Mudança: Em C ++, uma function declarada com uma lista de parâmetros vazia não recebe argumentos. Em C, uma lista de parâmetros vazia significa que o número e o tipo dos argumentos da function são desconhecidos.

Exemplo:

 int f(); // means int f(void) in C ++ // int f( unknown ) in C 

Justificativa: Isto é para evitar chamadas de function erradas (ou seja, chamadas de function com o número errado ou tipo de argumentos).

Efeito no recurso original: altere para semântica de recurso bem definido. Esse recurso foi marcado como “obsoleto” em C.

8.5.3 funções diz:

4. A cláusula de declaração de parâmetro determina os argumentos que podem ser especificados e seu processamento, quando a function é chamada. […] 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.

C99

Como mencionado por C ++ 11, int f() não especifica nada sobre os argumentos e é obsoleto.

Pode levar a código de trabalho ou UB.

Eu interpretei o padrão C99 detalhadamente em: https://stackoverflow.com/a/36292431/895245

Em C, você usa um vazio em uma referência de function vazia para que o compilador tenha um protótipo e esse protótipo não tenha “argumentos”. Em C ++, você não precisa dizer ao compilador que você tem um protótipo porque não pode deixar de fora o protótipo.

Intereting Posts