Ir ao conteúdo
  • Cadastre-se

C Qual é a principal diferença no uso do "Typedef" em struct no código?


davii_10_BRA
Ir à solução Resolvido por arfneto,

Posts recomendados

Ainda não entendi muito bem a diferença nitida do uso do Typedef em struct, sei que cria um novo tipo no código, temos por ex os tipos int, float... Sei que cria um novo tipo mas tenho 2 códigos aqui com e sem o uso de Typedef e não consegui notar diferenças na utilização pois ambos no código chamam os nomes da struct.variavel dentro da struct e no final da tudo certo, não entendi quando e não utilizar o Typedef.

 

Uso de typedef

#include <stdio.h>
#include <stdlib.h>

#define TRUE 1

typedef struct _f { //criando um tipo de struct
    int ladoA, ladoB, area, perimetro;
} Figura; //"figura" = nome do typedef, que envolve a linha 4 e 5.

int main(){
    Figura fig; //Aqui eu chamo o nome do typedef "figura" e atribuo tudo que esta em typedef dentro da variavel fig para que seja
    //utilizada posteriormente no codigo para chamar cada uma das variaveis criadas no typedef
    
    FILE *arqEnt, *arqSai;
    
    arqEnt = fopen("reang.in", "r");
    if(arqEnt == NULL){
        printf("Erro no arquivo de entrada\n");
        exit(1);
    }
    
    arqSai = fopen("resultado.txt", "w");
    if(arqSai == NULL){
        printf("Erro no arquivo de saida\n");
        exit(1);
    }
    
    while(TRUE){//true = loop infinito
        fscanf(arqEnt, "%d %d", &fig.ladoA, &fig.ladoB);
        
        if(fig.ladoA==0 || fig.ladoB==0)
            break;
            
        fig.area = fig.ladoA * fig.ladoB;
        fig.perimetro = 2 * (fig.area + fig.ladoB);
        
        fprintf(arqSai, " Area:%d\tPerimetro:%d\n", fig.area, fig.perimetro);
    }
    
    fclose(arqEnt);
    fclose(arqSai);
    
    return 0;
}

 

--------------------------------------------------------------------------------------------------------------------------------------------------------------

Sem typedef

#include <stdio.h>

int main( void )
{
    
    struct ficha_aluno //Struct, usado para armazenar, diversos dados, relativos a uma única coisa.
    {
        char nome[40];
        int numero;
        float nota;
    } aluno;
    
    printf("\n ---------- Cadastro de aluno ------------ \n\n");
    
    printf("Nome do aluno .....: ");
    fgets(aluno.nome, 40, stdin); //aluno: Tipo da struct, e depois do ponto é em qual variavel eu quero armazenar o que será digitado.
    // stdin (conjunto de caracteres que virão do teclado).
    
    printf("Digite o número do aluno: ");
    scanf("%d", &aluno.numero); //Será armazenado na variável numero na struct ficha_aluno
    
    printf("Informe a nota do aluno: ");
    scanf("%f", &aluno.nota);
    
    printf("\n\n -------- Lendo os dados do struct ------- \n\n");
    printf("Nome ....: %s", aluno.nome);
    printf("Numero ....: %d \n", aluno.numero);
    printf("Nota ....:%.2f \n", aluno.nota);
    return (0);
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Solução

Não sei se entendi a pergunta. Afinal você postou as diferenças e aí citou apenas o que é igual, a referência ao nome.

 

typedef cria um nome. Não necessariamente uma estrutura.

 

Uma struct pode ser anônima, como em

 

struct
{
        char nome[40];
        int numero;
        float nota;
} aluno;

 

ou não, como em seu exemplo

 

    struct ficha_aluno
    {
        char nome[40];
        int numero;
        float nota;
    } aluno;
    

 

onde aluno é struct ficha_aluno como seu compilador pode te dizer. Ou o IDE image.png.6a893b7fab243d17e4f7f1eebed5f26b.png

 

como nessa figura.

 

E note que o compilador está avisando que você não inicializou a variável...

 

Há uma convenção em C que talvez deva seguir, no sentido de usar a primeira letra em maiúscula para as struct que cria e reservar os nomes em maiúsculas para os #define. É o que espera em toda parte e o que vai ver em todo software open source por exemplo. 

 

EXEMPLO

 

	size_t coisa = 0;

 

size_t é usado em toda parte em C. Várias funções de stdlib.h esperam isso como argumento.

 

Não por acaso está em vcruntime.h no Windows e veja o que é

 

// Definitions of common types
#ifdef _WIN64
    typedef unsigned __int64 size_t;

 

e que diabo é __int64? É long long.

 

typedef oferece um tipo de encapsulamento também. É muito mais conveniente declarar Aluno como um typedef se vai passar como parâmetro em dúzias de funções, porque não precisa repetir struct TODA vez. E se acabar esquecendo alguma o programa não vai compilar.

 

EXEMPLO

 

Esse programa mostra como é mais conveniente usar typedef

 

#include <stdio.h>

typedef  struct
{
    char  nome[40];
    int   numero;
    float nota;
} Aluno;

struct ficha_aluno
{
    char  nome[40];
    int   numero;
    float nota;
};

Aluno* junta_info(Aluno* um, Aluno* outro) { return NULL; };

struct ficha_aluno* junta_info(struct ficha_aluno* um, struct ficha_aluno* outro)
{
    return NULL;
};

int main(void)
{
    Aluno   teste = {.numero = 12, .nome = "Jhonny"};
    struct ficha_aluno other = {.numero = 2, .nome = "Cash"};
    size_t  coisa = 0;
    __int64 x     = 0;

    return (0);
}
  

 

Espero que tenha entendido

 

 

  • Curtir 1
  • Obrigado 2
Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!