Falando funcional e sintaticamente, existe uma diferença entre uma função cujo protótipo é int foo(void)
e int foo(void *)
?
Eu sei a diferença entre, por exemplo, int bar(int)
e int bar(int *)
- um deles está procurando um int e o outro está procurando um ponteiro int. Comporta- void
se da mesma maneira?
c++
c
function-prototypes
Nick Reed
fonte
fonte
foo(void)
efoo()
.Respostas:
A partir desta resposta em Engenharia de software,
void
é tratado especialmente dependendo de como é usado. InC
eC++
,void
é usado para indicar uma ausência de um tipo de dados, enquanto quevoid *
é usado para indicar um ponteiro que aponta para alguns dados / espaço na memória que não possui um tipo.void *
não pode ser desreferenciado por si só e deve ser convertido para outro tipo primeiro. Essa conversão não precisa ser explícitaC
, mas deve ser explícitaC++
. (É por isso que não lançamos o valor de retorno do malloc, que évoid *
.)Quando usado com uma função como parâmetro,
void
significa uma ausência total de quaisquer parâmetros e é o único parâmetro permitido. Tentar usar o void como um tipo de variável ou incluir outros argumentos resulta em um erro do compilador:É igualmente impossível declarar uma variável com o tipo
void
:void
como um valor de retorno para uma função indica que nenhum dado será retornado. Como é impossível declarar uma variável do tipovoid
, é impossível capturar o valor de retorno de umavoid
função, mesmo com um ponteiro nulo.O tipeless
void *
é um caso diferente. Um ponteiro nulo indica um ponteiro para um local na memória, mas não indica o tipo de dados nesse ponteiro. (É usado para obter polimorfismo em C , como na função qsort () .) Esses indicadores podem ser difíceis de usar, no entanto, pois é muito fácil convertê-los acidentalmente no tipo errado. O código abaixo nãoC
gera erros de compilação , mas resulta em um comportamento indefinido:O código a seguir, no entanto, é perfeitamente legal; converter de e para um ponteiro nulo nunca altera o valor que ele possui.
Como parâmetro de função,
void *
indica que o tipo de dados no ponteiro em que você está passando não é conhecido e cabe a você, programador, lidar adequadamente com o que estiver naquele local de memória. Como valor de retorno,void *
indica que o tipo de dado retornado não é conhecido ou não possui tipo de letra e deve ser tratado pelo programa.tl; dr
void
em um protótipo de função significa "sem dados" e indica nenhum valor de retorno ou sem parâmetros,void *
em um protótipo de função significa "os dados no ponteiro a que essa função é fornecida não têm um tipo conhecido" e indica um parâmetro ou valor de retorno cujo ponteiro deve ser convertido para um tipo diferente antes que os dados no ponteiro possam ser usados.fonte
void * ... must be cast to another type first, but may be done so without an explicit cast.
Não é verdade em C ++. No C ++, o formulário de conversãovoid*
deve ser explícito. O PS que chama um explícito de conversão é redundante, pois, por definição, é uma conversão explícita.foo(void)
- função sem parâmetrosfoo(void *)
- função com umvoid *
parâmetroO que é
void *
? É apenas o ponteiro para os dados sem nenhum tipo especificado. Pode ser convertido para qualquer outro tipo de ponteirofonte
(type) vs. (type *)
universo dos casais, porque o vazio não é realmente um tipo.Há uma diferença:
int foo(void)
declara uma função que não aceita argumentos.int foo(void *)
declara uma função que aceita o argumento único do tipovoid*
.Em C ++,
int foo(void)
é equivalente aint foo()
.fonte