Partilhar via


Declarações Typedef

Uma declaração typedef é uma declaração com typedef como a classe de armazenamento. O declarador torna-se um novo tipo. Você pode usar declarações typedef para construir nomes mais curtos ou mais significativos para tipos já definidos por C ou para tipos que você declarou. Os nomes Typedef permitem encapsular detalhes de implementação que podem ser alterados.

Uma declaração typedef é interpretada da mesma forma que uma declaração de variável ou função, mas o identificador, em vez de assumir o tipo especificado pela declaração, torna-se um sinônimo para o tipo.

Sintaxe

declaration:
declaration-specifiers init-declarator-list optar por;

declaration-specifiers:
storage-class-specifier declaration-specifiers optar por
type-specifier declaration-specifiers optar por
type-qualifier declaration-specifiers optar por

storage-class-specifier:
typedef

type-specifier:
void
char
short
int
long
float
double
signed
unsigned
struct-or-union-specifier
enum-specifier
typedef-name

typedef-name:
identifier

Uma declaração typedef não cria novos tipos. Ele cria sinônimos para tipos existentes ou nomes para tipos que poderiam ser especificados de outras maneiras. Quando um nome typedef é usado como um especificador de tipo, ele pode ser combinado com certos especificadores de tipo, mas não outros. Os modificadores aceitáveis incluem const e volatile.

Os nomes Typedef compartilham o espaço do nome com identificadores comuns. Para obter mais informações, consulte Espaços de nome. Portanto, um programa pode ter um nome typedef e um identificador de escopo local com o mesmo nome. Por exemplo:

typedef char FlagType;

int main()
{
}

int myproc( int )
{
    int FlagType;
}

Quando você declara um identificador de escopo local pelo mesmo nome que um typedef, ou quando declara um membro de uma estrutura ou união no mesmo escopo ou em um escopo interno, você também deve especificar o especificador de tipo. Este exemplo ilustra essa restrição:

typedef char FlagType;
const FlagType x;

Para reutilizar o nome de um identificador, um membro da FlagType estrutura ou um membro da união, o tipo deve ser fornecido:

const int FlagType;  /* Type specifier required */

Não basta dizer

const FlagType;      /* Incomplete specification */

porque o FlagType é considerado parte do tipo, não um identificador que está sendo retornado. Esta declaração é considerada uma declaração ilegal como

int;  /* Illegal declaration */

Você pode declarar qualquer tipo com typedef, incluindo tipos de ponteiro, função e matriz. Você pode declarar um nome typedef para um ponteiro para uma estrutura ou tipo de união antes de definir a estrutura ou o tipo de união, desde que a definição tenha a mesma visibilidade que a declaração.

Os nomes Typedef podem ser usados para melhorar a legibilidade do código. Todas as três declarações a seguir especificam signal exatamente o mesmo tipo, a primeira sem fazer uso de nenhum nome typedef.

typedef void fv( int ), (*pfv)( int );  /* typedef declarations */

void ( *signal( int, void (*) (int)) ) ( int );
fv *signal( int, fv * );   /* Uses typedef type */
pfv signal( int, pfv );    /* Uses typedef type */

Exemplos

Os exemplos a seguir ilustram declarações typedef:

typedef int WHOLE; /* Declares WHOLE to be a synonym for int */

Por exemplo, agora pode ser usado em uma declaração variável, WHOLE como WHOLE i; ou const WHOLE i;. No entanto, a declaração long WHOLE i; seria ilegal.

typedef struct club
{
    char name[30];
    int size, year;
} GROUP;

Esta declaração declara GROUP como um tipo de estrutura com três membros. Como uma tag structure, club, também é especificada, o nome typedef (GROUP) ou a tag structure podem ser usados em declarações. Você deve usar a struct palavra-chave com a tag e não pode usar a struct palavra-chave com o nome typedef.

typedef GROUP *PG; /* Uses the previous typedef name
                      to declare a pointer            */

O tipo PG é declarado como um ponteiro para o GROUP tipo, que por sua vez é definido como um tipo de estrutura.

typedef void DRAWF( int, int );

Este exemplo fornece o tipo DRAWF para uma função que não retorna nenhum valor e usa dois argumentos int. Significa, por exemplo, que a declaração

DRAWF box;

é equivalente à declaração

void box( int, int );

Ver também

Declarações e Tipos