Partilhar 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 nomeado pelo identificador é chamada de "definição". As declarações C para variáveis, funções e tipos têm esta sintaxe:

Sintaxe

declaration:
declaration-specifiers attribute-seq init-declarator-list optar poroptar por;

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

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

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 seções a seguir geralmente começa com o declarator não-terminal.

As declarações no init-declarator-list contêm os identificadores que estão sendo nomeados, init é uma abreviação para inicializador. O init-declarator-list é uma sequência separada por vírgulas de declaradores, cada um dos quais pode ter informações de tipo adicionais, ou um inicializador, ou ambos. O declarator contém os identificadores, se houver, que estão sendo declarados. O declaration-specifiers não-terminal consiste em uma sequência de especificadores de tipo e classe de armazenamento que indicam a ligaçã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 abreviatura para sequência. Esses atributos específicos da Microsoft executam várias funções, que são discutidas em detalhes ao longo deste livro.

Na forma geral de uma declaração de 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 dá o nome da variável, possivelmente modificada 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 () int não modificávelconst. 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 itens de caractere, inteiro e ponto flutuante) ou estruturas e uniões de variáveis simples, o declarator é apenas um identificador. Para obter mais informações sobre declaradores, consulte Declaradores e declarações variáveis.

Todas as definições são implicitamente declarações, mas nem todas as declarações são definições. Por exemplo, as declarações de variáveis que usam o extern especificador de classe de armazenamento estão "referenciando", em vez de "definindo" declarações. Se uma variável externa deve ser referida antes de ser definida, ou se é definida em outro arquivo de origem daquele em que é usada, uma extern declaração é 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 variáveis. Com exceção __declspecdo , 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 fazer referência ao item.

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

A localização 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 na determinação do 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 ligação interna, esta regra aplica-se separadamente a cada unidade de tradução, porque os objetos ligados internamente são exclusivos de uma unidade de tradução. Para objetos com ligação externa, esta regra aplica-se 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 componentes 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 de união.

Existem 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 Qualificadores de tipo. Para obter uma definição de valores l, consulte Expressões de valor L e valor R.

Ver também

Resumo da sintaxe da linguagem C
Declarações e Tipos
Resumo das declarações