Programação
 › Algoritmo  › C/C++  › Java
Web
 › HTML/XHTML  › JavaScript  › PHP
Sistema Operacional
 › Comandos de DOS  › Windows  › Linux  › Mac/BSD
Office
 › Word / Writer  › Excel / Calc
Áreas do Site
 › Download  › Fórum  › Blog
Recomendamos
Computadores e Informática em Lisboa
TI Expert » Programação » C/C++ » Typedef - Definição de Nomes de Tipos

Typedef

Em C e C++ podemos redefinir um tipo de dado dando-lhe um novo nome.

Essa forma de programação 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 provém de type definition.

Typedef faz o compilador assumir que o novo nome é um certo tipo de dado, e então, passamos a usar o novo nome da mesma forma que usaríamos o antigo.

Por exemplo, podemos definir que, ao invés de usarmos int, agora usaremos inteiro ou, ao invés de usarmos float, usaremos decimal.

Typedef deve sempre vir antes de qualquer programação que envolva procedimentos (protótipo de funções, funções, função main, structs, etc.) e sua sintase base é:

typedef nome_antigo nome novo;

Dessa forma, simplesmente, definiríamos o exemplo acima como:

typedef int inteiro;
typedef float decimal;

Se fossemos utilizar essas novas definições 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 código. 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).

Graças 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 fizéssemos isso:

typedef struct estrutura1 MinhaEstrutura;
struct estrutura1 {
    int var1;
    float var2;
};

Da segunda forma seria o mesmo que fizéssemos isso:

typedef struct estrutura1 {
    int var1;
    float var2;
} MinhaEstrutura;

Agora, que já possuímos uma estrutura de dados definida com um nome, nós podemos utilizá-la 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 impossível de ser feito se declarássemos dentro de estrutura2 o var4 como sendo estrutura1.

Para demonstrar com algo mais concreto, abaixo está um algoritmo que obtém 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<<"/";
    cout << alguem.nascimento.mes<<"/";
    cout << alguem.nascimento.ano<<endl;
    system ("pause");
    return EXIT_SUCCESS;
}
Faça o Download deste Código

No algoritmo acima, obtemos o nome da pessoa dentro de uma string na struct aniversario, e dentro desta estrutura também há outra struct que define os dados contidos em qualquer data (dia, mês e ano). Então, declaramos uma variável chamada alguem do tipo aniversario (que é na verdade o struct aniversario). Pegamos uma string e guardamos dentro do membro nome. As datas são 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 variável 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 estivéssemos entrando em várias pastas diferentes até chegar ao arquivo que queremos e, ao invés, de separar cada estrutura com uma barra (como acontece com as pastas), nós separamos cada estrutura com um ponto.

Creative Commons License
Autor: Denys William Xavier
Este artigo está sob Licença Creative Commons.

Faça o download da versão em PDF Indique nosso site Gostou?
Indique nosso site!
Este artigo foi
lido 108497 vezes
Bookmark e Compartilhe

Páginas Relacionadas

Enquete
O Google Chrome OS irá desbancar o Microsoft Windows 7?
» ProgramaçãoAlgorítmo | C/C++ | Java

» WebHTML/XHTML | JavaScript | PHP

» Sistema OperacionalComandos de DOS | Windows | Linux | Mac/BSD

» OfficeWord/Wirter | Excel/Calc

» Áreas do SiteDownloads | Fórum | Blog