Capítulo 13: Typedef
Aluna: Eyre Brasil Montevecchi – Github
13.1. Definição
A palavra reservada typedef é utilizada para criar um alias ou “apelido” para tipos de dados na linguagem C e C++. Desta forma, tipos de dados podem ser organizados segundo a sua função e tipos com definições ou declarações de variáveis complexas e longas podem ter sua nomenclatura simplificada. Sua forma geral é:
typedef antigo_nome novo_nome;
Abaixo temos exemplos de sua utilização em programas C:
#define MAX 10
int main () {
typedef int vetorIntTamMAX[MAX];
typedef char novoChar;
typedef int contador;
typedef int *ponteiroInt;
vetorIntTamMAX v1;
novoChar c1;
contador i, j;
ponteiroInt p1;
return 0;
}
No trecho de código acima, o nome vetorIntTamMAX é definido como um alias ou uma outra forma mais resumida de declarar um vetor de inteiros com tamanho igual ao valor definido para a constante MAX. Agora, no programa acima, quando quisermos declarar um vetor desse tipo, basta escrever:
vetorIntTamMAX v1;
O mesmo se aplica aos demais apelidos criados: para declarar os contadores inteiros do programa acima, podemos utilizar o alias contador, que representa as variáveis do tipo int:
contador i, j;
13.2 Indicando o significado em declarações de variáveis
O typedef pode ser utilizado para dar significados a variáveis, organizando o programa e indicando que essas não são compatíveis dentro do contexto do programa, embora sejam compatíveis para o compilador. Veja o exemplo abaixo, com uma declaração sem a utilização do typedef:
int velocidade_atual;
int maior_pontuacao;
void congratular(int sua_pontuacao) {
if (sua_pontuacao > maior_pontuacao)
...
}
}
Agora o veja a modificação abaixo, expressando o contexto específicos dos tipos declarados:
typedef int km_por_hora;
typedef int pontos;
km_por_hora velocidade_atual;
pontos maior_pontuacao;
void congratular (pontos sua_pontuacao) {
if (sua_pontuacao > maior_pontuacao){
...
}
}
Os dois trechos de código executam da mesma maneira, mas no segundo trecho, é mais clara a incompatibilidade entre as variáveis velocidade_atual e maior_pontuacao, embora sejam ambas do tipo int e comparáveis para o compilador, que não apontaria nenhum problema ao compilar o código abaixo, que está incorreto contextualmente e retornará resultados indesejados para o programa em questão:
velocidade_atual = 100;
maior_pontuacao = velocidade_atual;
Porém, o compilador não aceitará modificações através de prefixos para esses apelidos criados. O código abaixo por exemplo, geraria erro de compilação:
typedef int pontos;
unsigned pontos a;
13.3 Simplificando definições e declarações
Podemos também simplificar o nome de tipos mais complexos, como as estruturas de dados (struct). Veja o trecho de código abaixo:
struct minhaStruct {
int dado1;
char dado2;
};
Agora que a struct minhaStruct foi definida, para declarar variáveis desse tipo em C, a palavra chave struct é obrigatória:
struct minhaStruct a;
Podemos eliminar a utilização da palavra struct de duas formas. Acrescentando a palavra typedef à declaração como abaixo:
typedef minhaStruct minhaStructNova;
//declaração agora fica:
minhaStructNova a;
Ou combinando a definição e declaração de uma vez só:
typedef struct nomeDaMinhaStruct{
int dado1;
char dado2;
} ApelidoDaMinhaStruct;
ApelidoDaMinhaStruct a;
Suponha porém, que estamos criando uma estrutura chamada nodo. Esta estrutura terá um valor chave e ponteiros que pontam para uma estrutura nodo também. Teríamos que utilizar a seguinte declaração abaixo:
typedef struct nodo{
int chave;
struct nodo *prox;
struct nodo *ante;
} Nodo;
Note que precisamos usar a palavra struct para declarar ponteiros para struct nodo, pois o apelido só é definido após o corpo da struct nodo. Para usarmos os ponteiros de forma mais simplificada, basta fazer como o exemplo abaixo:
typedef struct nodo Nodo;
struct Nodo{
int chave;
Nodo *prox;
Nodo *ante;
};
13.4 Exercícios
Para treinar a utilização do typedef, acesse a lista de exercícios desse capítulo em Lista de exercícios.
13.5 Referências
Typedef. Wikipédia, 2017. Disponível em: <https://en.wikipedia.org/wiki/Typedef>. Acesso em: 10 nov. 2017.
ARAÚJO, Aldrovando Luís Azeredo. Curso de C da UFMG – Aula 11 – Tipos de dados definidos pelo Usuário: o comando typedef. CPDEE/UFMG, 1999. Disponível em: <http://mtm.ufsc.br/~azeredo/cursoC/aulas/cb60.html>. Acesso em: 10 nov. 2017.