Tipo de vazio - Void type
O tipo void , em várias linguagens de programação derivadas de C e Algol68 , é o tipo para o resultado de uma função que retorna normalmente, mas não fornece um valor de resultado para seu chamador. Normalmente, essas funções são chamadas por seus efeitos colaterais , como executar alguma tarefa ou gravar em seus parâmetros de saída. O uso do tipo void em tal contexto é comparável a procedimentos em Pascal e construções sintáticas que definem sub-rotinas em Visual Basic . Também é semelhante ao tipo de unidade usado em linguagens de programação funcional e teoria de tipo. Consulte o tipo de unidade # em linguagens de programação para uma comparação.
C e C ++ também suportam o ponteiro para o tipo void (especificado como void *
), mas esta é uma noção não relacionada. Variáveis desse tipo são ponteiros para dados de um tipo não especificado , portanto, neste contexto (mas não nos outros) void *
atua aproximadamente como um tipo universal ou superior . Um programa provavelmente pode converter um ponteiro para qualquer tipo de dado (exceto um ponteiro de função ) em um ponteiro para void e de volta ao tipo original sem perder informações, o que torna esses ponteiros úteis para funções polimórficas . O padrão da linguagem C não garante que os diferentes tipos de ponteiro tenham o mesmo tamanho ou alinhamento.
Em C e C ++
Uma função com tipo de resultado void termina atingindo o final da função ou executando uma instrução de retorno sem nenhum valor retornado. O tipo void também pode aparecer como o único argumento de um protótipo de função para indicar que a função não aceita argumentos. Observe que, apesar do nome, em todas essas situações, o tipo de vazio serve como um tipo de unidade , não como um tipo zero ou inferior (que às vezes é confundidamente chamado de "tipo de vazio"), embora diferente de um tipo de unidade real que é um singleton, o tipo void carece de uma maneira de representar seu valor e a linguagem não fornece nenhuma maneira de declarar um objeto ou representar um valor com o tipo void
.
Nas primeiras versões de C, funções sem resultado específico padronizado para um tipo de retorno de int
e funções sem argumentos simplesmente tinham listas de argumentos vazias. Ponteiros para dados não digitados foram declarados como inteiros ou ponteiros para char
. Alguns compiladores C antigos tinham o recurso, agora visto como um aborrecimento, de gerar um aviso em qualquer chamada de função que não usasse o valor retornado da função. O código antigo às vezes converte essas chamadas de função para void para suprimir esse aviso. Na época em que Bjarne Stroustrup começou seu trabalho em C ++ em 1979–1980, void e void pointers eram parte do dialeto da linguagem C suportado por compiladores derivados da AT&T.
O uso explícito de void vs. não fornecer argumentos em um protótipo de função tem semânticas diferentes em C e C ++, conforme detalhado na tabela a seguir:
C | Equivalente C ++ |
---|---|
void f(void);
|
void f(); ( preferencial )void f(void);
|
void f(); ( aceita um número constante, mas desconhecido de argumentos )
|
template <typename... Ts> void f(Ts... ts) {}
(não estritamente equivalente) |
O protótipo AC sem argumentos, por exemplo void f()
, acima, foi descontinuado no C99 , no entanto.
Em Haskell
Bem ao contrário do C ++, na linguagem de programação funcional Haskell o tipo void denota o tipo vazio, que não possui habitantes [1] . Uma função no tipo void não retorna resultados, e um programa com efeito colateral com assinatura de tipo IO Void
não termina ou trava. Em particular, não há funções totais no tipo vazio.