Compartilhar via


Visão geral das declarações

Uma "declaração" especifica a interpretação e os atributos de um conjunto de identificadores. Uma declaração que também faz com que o armazenamento seja reservado para o objeto ou função nomeada pelo identificador é chamada de "definição". As declarações C para variáveis, funções e tipos têm essa sintaxe:

Sintaxe

declaration:
declaration-specifiers attribute-seq optarinit-declarator-listoptar;

/* attribute-seq opt é específico da Microsoft */

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

init-declarator-list:
init-declarator
init-declarator-list , init-declarator

init-declarator:
declarator
declarator = initializer

Observação

Essa sintaxe não declaration é repetida nas seções a seguir. A sintaxe nas seções a seguir geralmente começa com o declarator não-minal.

As declarações no init-declarator-list contém os identificadores que estão sendo nomeados; init é uma abreviação para inicializador. É init-declarator-list uma sequência separada por vírgulas de declaradores, cada um deles pode ter informações de tipo adicionais ou um inicializador ou ambos. O declarator contém os identificadores, se houver, sendo declarados. O declaration-specifiers não-terminal consiste em uma sequência de especificadores de tipo e de classe de armazenamento que indicam a vinculação, a duração do armazenamento e pelo menos parte do tipo das entidades que os declaradores denotam. As declarações são compostas por alguma combinação de especificadores de classe de armazenamento, especificadores de tipo, qualificadores de tipo, declaradores e inicializadores.

As declarações podem conter um ou mais dos atributos opcionais listados em attribute-seq; seq é uma abreviação para sequência. Esses atributos específicos da Microsoft executam várias funções, que são discutidas detalhadamente ao longo deste livro.

Na forma geral de uma declaração de variável, type-specifier fornece o tipo de dados da variável. Pode type-specifier ser um composto, como quando o tipo é modificado por const ou volatile. Fornece declarator o nome da variável, possivelmente modificado para declarar uma matriz ou um tipo de ponteiro. Por exemplo

int const *fp;

declara uma variável nomeada fp como um ponteiro para um valor não modificável (const). int Você pode definir mais de uma variável em uma declaração usando vários declaradores, separados por vírgulas.

Uma declaração deve ter pelo menos um declarador ou seu especificador de tipo deve declarar uma marca de estrutura, marca de união ou membros de uma enumeração. Os declaradores fornecem todas as informações restantes sobre um identificador. Um declarador é um identificador que pode ser modificado com colchetes ([ ]), asteriscos (*) ou parênteses ( ( ) ) para declarar uma matriz, ponteiro ou tipo de função, respectivamente. Quando você declara variáveis simples (como caracteres, inteiros e itens de ponto flutuante) ou estruturas e uniões de variáveis simples, o declarator identificador é apenas um identificador. Para obter mais informações sobre declaradores, consulte Declaradores e Declarações variáveis.

Todas as definições são declarações implicitamente, mas nem todas as declarações são definições. Por exemplo, declarações de variável usando o extern especificador de classe de armazenamento são "referenciando", em vez de declarações de "definição". Se uma variável externa deve ser referenciada antes de ser definida ou se ela for definida em outro arquivo de origem daquela em que ela é usada, uma declaração extern será necessária. O armazenamento não é alocado por declarações de "referência", nem as variáveis podem ser inicializadas em declarações.

Uma classe de armazenamento ou um tipo (ou ambos) é necessário em declarações de variável. Com exceção __declspecde, apenas um especificador de classe de armazenamento é permitido em uma declaração e nem todos os especificadores de classe de armazenamento são permitidos em todos os contextos. A __declspec classe de armazenamento é permitida com outros especificadores de classe de armazenamento e é permitida mais de uma vez. O especificador de classe de armazenamento de uma declaração afeta como o item declarado é armazenado e inicializado e quais partes de um programa podem referenciar o item.

Os storage-class-specifier terminais definidos em C incluemauto, extern, registere typedefstatic. O Microsoft C também inclui o storage-class-specifier terminal __declspec. Todos os storage-class-specifier terminais, exceto typedef e __declspec discutidos em Classes de Armazenamento. Para obter informações sobre typedef, consulte typedef Declarações. Para obter informações sobre __declspec, consulte Atributos de Storage-Class Estendidos.

O local da declaração dentro do programa de origem e a presença ou ausência de outras declarações da variável são fatores importantes para determinar o tempo de vida das variáveis. Pode haver várias redeclarações, mas apenas uma definição. No entanto, uma definição pode aparecer em mais de uma unidade de tradução. Para objetos com vinculação interna, essa regra se aplica separadamente a cada unidade de tradução, pois objetos vinculados internamente são exclusivos de uma unidade de tradução. Para objetos com vinculação externa, essa regra se aplica a todo o programa. Para obter mais informações sobre visibilidade, consulte Tempo de Vida, Escopo, Visibilidade e Vinculação.

Os especificadores de tipo fornecem algumas informações sobre os tipos de dados de identificadores. O especificador de tipo padrão é int. Para obter mais informações, consulte Especificadores de Tipo. Os especificadores de tipo também podem definir marcas de tipo, nomes de componente de estrutura e união e constantes de enumeração. Para obter mais informações, consulte Declarações de Enumeração, Declarações de Estrutura e Declarações da União.

Há dois type-qualifier terminais: const e volatile. Esses qualificadores especificam propriedades extras de tipos que são relevantes somente ao acessar objetos desse tipo por meio de valores l. Para obter mais informações sobre const e volatile, consulte Type Qualifiers. Para obter uma definição de l-values, consulte L-Value e R-Value Expressions.

Consulte também

Resumo da sintaxe da linguagem C
Declarações e tipos
Resumo das Declarações