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 inte 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.

Referências