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 causa a reserva do armazenamento para o objeto ou a função nomeada pelo identificador é chamada de uma "definição". As declarações de C para variáveis, funções e tipos têm esta sintaxe:

Sintaxe

declaration:
declaration-specifiers attribute-seqopt init-declarator-listopt ;

/* attribute-seqopt é específico da Microsoft */

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

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

init-declarator:
declarator
declarator = initializer

Observação

Esta sintaxe para declaration não é repetida nas seções a seguir. A sintaxe nas seguintes seções normalmente inicia com declarator não terminal.

As declarações na init-declarator-list contêm os identificadores que estão sendo nomeados; init é uma abreviação para o inicializador. A init-declarator-list é uma sequência de declaradores separada por vírgulas, em que cada um pode ter informações adicionais do tipo ou um inicializador ou ambos. O declarator contém os identificadores, se houver, sendo declarados. A declaration-specifiers terminal consiste em uma sequência dos especificadores de tipo e classe de armazenamento que indicam o vínculo, a duração de armazenamento e ao menos parte do tipo de entidades que os declaradores denotam. As declarações são constituídas de uma 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 de sequência. Esses atributos específicos da Microsoft executam diversas funções, que serão discutidas em detalhes ao longo deste documento.

No formato geral de uma declaração variável, type-specifier fornece o tipo de dados da variável. O type-specifier pode ser um composto, como quando o tipo é modificado por const ou volatile. O declarator fornece 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 (const) int não modificável. 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 toda quaisquer outras informações sobre um identificador. Um declarador é um identificador que pode ser modificado com colchetes ([ ]), asteriscos (*) ou parênteses ( ( ) ) para declarar uma matriz, um ponteiro ou um tipo de função, respectivamente. Quando você declara variáveis simples (como o caractere, inteiro e itens de ponto flutuante), ou estruturas e uniões de variáveis simples, declarator é apenas um identificador. Para obter mais informações sobre os declaradores, consulte Declaradores e declarações de variável.

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

Uma classe de armazenamento ou um tipo (ou ambos) são necessários em declarações de variáveis. Com exceção de __declspec, apenas um especificador de classe de armazenamento é permitido em uma declaração e nem todos os especificadores de armazenamento classe são permitidos em cada contexto. A classe de armazenamento __declspec é 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 fazer referência ao item.

Os terminais storage-class-specifier definidos em C incluem auto, extern, register, static e typedef. O Microsoft C também inclui o storage-class-specifier terminal __declspec. Todos os terminais storage-class-specifier exceto typedef e __declspec são discutidos em Classes de armazenamento. Para obter informações sobre typedef, consulte typedef Declarações. Para obter informações sobre __declspec, consulte Atributos de classe de armazenamento estendidos.

O local da declaração no programa de origem e da presença ou ausência de outras instruções da variável são fatores importantes na determinação de diversas 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, esta regra é aplicada separadamente a cada unidade de tradução, pois os objetos internamente vinculados são exclusivos para uma unidade de tradução. Para objetos com vinculação externa, essa regra se aplica ao programa inteiro. Para obter mais informações sobre visibilidade, consulte Tempo de vida, escopo, visibilidade e vinculação.

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

Há dois terminais type-qualifier: 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 Qualificadores do tipo. Para uma definição de l-values, consulte Expressões de l-value e r-value.

Confira também

Resumo da sintaxe da linguagem C
Declarações e tipos
Resumo de declarações