Classe de armazenamento
O especificador storage-class em uma definição de função fornece à função uma classe de armazenamento de extern
ou static
.
Sintaxe
function-definition
:
declaration-specifiers
opt attribute-seq
opt declarator
declaration-list
opt compound-statement
/* attribute-seq
é específico da Microsoft */
declaration-specifiers
:
storage-class-specifier
declaration-specifiers
opt
type-specifier
declaration-specifiers
opt
type-qualifier
declaration-specifiers
opt
storage-class-specifier
: /* Para definições de função */
extern
static
Se uma definição de função não incluir um storage-class-specifier
, a classe de armazenamento será extern
por padrão. Você pode declarar explicitamente uma função como extern
, mas isso não é necessário.
Se a declaração de uma função contiver o storage-class-specifier
extern
, o identificador terá o mesmo vínculo de qualquer declaração visível do identificador com o escopo de arquivo. Se não há nenhuma declaração visível com escopo de arquivo, o identificador tem uma vinculação externa. Se um identificador tiver escopo de arquivo e nenhum storage-class-specifier
, o identificador terá vinculação externa. Vinculação externa significa que cada instância do identificador denota o mesmo objeto ou função. Para obter mais informações sobre vinculação e escopo de arquivo, confira Tempo de vida, escopo, visibilidade e vinculação.
As declarações de função block-scope com um especificador storage-class diferente de extern
geram erros.
Uma função com a classe de armazenamento static
é visível apenas no arquivo de origem no qual é definida. Todas as outras funções, que receberam a classe de armazenamento extern
explicitamente ou implicitamente, são visíveis em todos os arquivos de origem no programa. Se a classe de armazenamento static
for desejada, ela deverá ser declarada na primeira ocorrência de uma declaração (se houver) da função e na definição da função.
Seção específica da Microsoft
Quando as extensões da Microsoft são habilitadas, uma função originalmente declarada sem uma classe de armazenamento (ou com a classe de armazenamento extern
) receberá a classe de armazenamento static
se a definição da função estiver no mesmo arquivo de origem e se a definição especificar explicitamente a classe de armazenamento static
.
Quando compiladas com a opção do compilador /Ze, as funções declaradas em um bloco usando a palavra-chave extern
têm visibilidade global, o que não ocorre na compilação com /Za. Não confie nesse recurso se a portabilidade do código-fonte for uma consideração importante.
Fim da seção específica da Microsoft