Você está na página 1de 3

www.tiexpert.

net

Pg. 1 de 3

Typedef
Em C e C++ podemos redefinir um tipo de dado dando-lhe um novo nome. Essa forma de programao ajuda em dois sentidos: 1. Fica mais simples entender para que serve tal tipo de dado; 2. a nica forma de conseguirmos referenciar uma estrutura de dados dentro de outra (struct dentro de struct). Para redefinirmos o nome de um tipo de dado usamos o comando typedef, que provm de type definition. Typedef faz o compilador assumir que o novo nome um certo tipo de dado, e ento, passamos a usar o novo nome da mesma forma que usaramos o antigo. Por exemplo, podemos definir que, ao invs de usarmos int, agora usaremos inteiro ou, ao invs de usarmos float, usaremos decimal. Typedef deve sempre vir antes de qualquer programao que envolva procedimentos (prottipo de funes, funes, funo main, structs, etc.) e sua sintase base : typedef nome_antigo nome novo; Dessa forma, simplesmente, definiramos o exemplo acima como: typedef int inteiro; typedef float decimal; Se fossemos utilizar essas novas definies em um programa ficaria assim: #include <iostream> #include <cstdlib> using namespace std; typedef int inteiro; typedef float decimal; int main (){ inteiro x = 1; decimal y = 1.5; cout << "X=" << x << "\nY=" << y << endl; system ("pause"); return EXIT_SUCCESS; } Nota importante: O uso de typedef para redefinir nomes de tipos primitivos (como int, float, char) altamente desencorajado por proporcionar uma menor legibilidade do cdigo. Portanto, devemos utilizar typedef apenas em momentos oportunos (como por exemplo, definir o nome de uma estrutura de dados complexa - struct).

Definindo nomes para estruturas de dados


Uma vantagem muito grande que typedef nos proporciona definir um nome para nossa estrutura de dados (struct). Graas a isso, somos capazes de auto-referenciar a estrutura, ou seja, colocar um tipo de dado struct dentro de outro struct. Podemos definir o nome de uma estrutura de dados (struct) de duas maneiras: Definindo o nome da estrutura e s depois definir a estrutura; ou definir a estrutura ao mesmo tempo que define o nome. Da primeira forma seria o mesmo que fizssemos isso:

http://www.tiexpert.net/programacao/c/typedef.php

www.tiexpert.net
typedef struct estrutura1 MinhaEstrutura; struct estrutura1 { int var1; float var2; }; Da segunda forma seria o mesmo que fizssemos isso: typedef struct estrutura1 { int var1; float var2; } MinhaEstrutura;

Pg. 2 de 3

Agora, que j possumos uma estrutura de dados definida com um nome, ns podemos utilizla dentro de outra estrutura de dados. Por exemplo: typedef struct estrutura1 MinhaEstrutura; struct estrutura1 { int var1; float var2; }; struct estrutura2 { int var3; MinhaEstrutura var4; }; Como podemos perceber, somos capazes de usar MinhaEstrutura (que na verdade o struct estrutura1) dentro do struct estrutura2 perfeitamente, sem maiores problemas. O que seria impossvel de ser feito se declarssemos dentro de estrutura2 o var4 como sendo estrutura1. Para demonstrar com algo mais concreto, abaixo est um algoritmo que obtm a data de nascimento de uma pessoa. #include <iostream> #include <cstdlib> #include <cstring> using namespace std; typedef struct data { unsigned short dia; unsigned short mes; unsigned int ano; } Data; typedef struct aniversario { char nome[50]; Data nascimento; } Aniversario; int main (){ Aniversario alguem; cout << "Digite o nome de alguem" << endl; cin.getline (alguem.nome, 50); cout << "Digite o dia que esta pessoa nasceu" << endl; cin >> alguem.nascimento.dia; cout << "Digite o mes que esta pessoa nasceu" << endl; cin >> alguem.nascimento.mes; cout << "Digite o ano que esta pessoa nasceu" << endl; cin >> alguem.nascimento.ano; system ("cls"); cout << alguem.nome << endl; cout << "nasceu em "; cout << alguem.nascimento.dia<<"/"; http://www.tiexpert.net/programacao/c/typedef.php

www.tiexpert.net
cout << alguem.nascimento.mes<<"/"; cout << alguem.nascimento.ano<<endl; system ("pause"); return EXIT_SUCCESS; }

Pg. 3 de 3

No algoritmo acima, obtemos o nome da pessoa dentro de uma string na struct aniversario, e dentro desta estrutura tambm h outra struct que define os dados contidos em qualquer data (dia, ms e ano). Ento, declaramos uma varivel chamada alguem do tipo aniversario (que na verdade o struct aniversario). Pegamos uma string e guardamos dentro do membro nome. As datas so acessadas da mesma forma, mas com um detalhe. Como alguem possui outro struct declarado dentro dele com o nome de nascimento, devemos primeiro acessar a varivel nascimento para s depois acessar o membro de sua estrutura. Esse conceito importante entender, porque podem existir muitas estruturas aninhadas e para acessar um determinado tipo de dado devemos percorrer toda estrutura. como se estivssemos entrando em vrias pastas diferentes at chegar ao arquivo que queremos e, ao invs, de separar cada estrutura com uma barra (como acontece com as pastas), ns separamos cada estrutura com um ponto.
Autor: Denys William Xavier Este artigo est sob Licena Creative Commons Para ver uma cpia desta licena, visite http://creativecommons.org/licenses/by-nc-sa/2.5/br/ ou envie uma carta para Creative Commons, 171 Second Street, Suite 300, San Francisco, California 94105, USA.

http://www.tiexpert.net/programacao/c/typedef.php