Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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 );