Qual é a diferença entre typedef e define em c?

#define é um token de pré-processador: o próprio compilador nunca o verá. typedef é um token do compilador: o pré-processador não se importa com isso.

Você pode usar um ou outro para obter o mesmo efeito, mas é melhor usar o adequado para suas necessidades

#define MY_TYPE inttypedef int My_Type;

Quando as coisas ficam "peludas", o uso da ferramenta adequada acerta

#define FX_TYPE vazio (*) (int)typedef void (* stdfx) (int);void fx_typ (stdfx fx); /* Está bem */void fx_def (FX_TYPE fx); / * erro * /

Rapazes

"Curtir e compartilhar"

minha página técnica / técnica do facebook

TechVedi

#define é uma macro de processamento de texto aplicada antes da análise real do C / C ++, enquanto typedef é um mecanismo abreviado do idioma. Ou seja, #define não é C, você pode usar o pré-processador que faz isso para outros trabalhos.

m4 (linguagem de computador)Metaprogramação

Para uma melhor depuração, o C ++ passou a usar modelos mais do que macros.

  • Primeira coisa que não há tipo de dados em define
  • Definir é simplesmente encontrar e substituir conceito
  • O Typedef envolve tipos de dados e é usado para criar alias de variáveis ​​de tipo de dados.

typedef define um tipo (duh!) Assim como por exemplo, é um tipo interno, você pode definir seu próprio como um alias para outro tipo ou como um agregado de tipos existentes em uma estrutura ou como uma lista de valores possíveis (enumeração).

#define é apenas um mecanismo de busca e substituição, onde o que você define é literalmente substituído no texto do código-fonte antes mesmo de ser analisado.

Eles podem ser usados ​​para realizar o mesmo tipo de trabalho em alguns casos, por exemplo:

#define MY_STATE_A 0#define MY_STATE_B 1

ou

enum typedef{ kMyStateA, kMyStateB}Estado;

Ambas as instruções criam um par de valores com o valor 0 ou 1. Mas a segunda é muito mais robusta, porque se você criar uma variável do tipo State, ela poderá usar apenas um dos dois valores definidos. Usando a abordagem #define, não existe um tipo 'State'; portanto, você provavelmente precisará usar int, que é imediatamente menos descritivo e pode ter qualquer valor, por isso é muito mais propenso a erros que não podem ser capturados pelo compilador. Em um depurador, a abordagem #define pode exibir apenas 0 ou 1, enquanto no caso typedef mostraria os valores descritivos reais por nome, tornando a depuração muito mais fácil.

Qualquer código poderia redefinir, por exemplo, MY_STATE_A como quisesse, e o compilador não se importaria. Mas seu programa provavelmente pararia de funcionar corretamente. No caso de typedef, isso seria impossível - o compilador perceberia o erro.

Alguns programadores parecem se esquivar do typedef, porque acreditam erroneamente que isso dificulta a codificação. Eu acredito que o oposto é o caso, então você deve usar o typedef sempre que apropriado - não seja preguiçoso e apenas #define as coisas que devem ser digitadas.

Esta é uma das minhas perguntas favoritas de todos os tempos da entrevista C A maneira correta de pensar sobre a diferença é visualizar um typedef como sendo um tipo "encapsulado" completo - você não pode adicioná-lo depois de o ter declarado.

  1. Você pode estender um nome de tipo de macro com outros especificadores de tipo, mas não um nome de tipo de tipo. Isso é,
  2. #define peach intpêssego não assinado i; /* funciona bem */typedef int banana;banana não assinada i; / * Bzzzt! ilegal * /

    2. Um nome typedef fornece o tipo para cada declarador em uma declaração.

    #define int_ptr int *int_ptr giz, queijo;

    Após a expansão da macro, a segunda linha se torna efetivamente:

    int * giz, queijo;

    Isso torna o giz e o queijo tão diferentes quanto o chutney e a cebolinha: o giz é um ponteiro para um número inteiro, enquanto o queijo é um número inteiro. Por outro lado, um typedef como este:

    typedef char * char_ptr;char_ptr Bentley, Rolls_Royce;

    declara que Bentley e Rolls_Royce são os mesmos. O nome na frente é diferente, mas ambos são um ponteiro para um caractere.

    3. typedef pode ser definido dentro de um escopo. A expansão de macro, por outro lado, é tratada pelo pré-processador e, portanto, é substituída globalmente.

    Fonte: Segredos do Deep C