Qual o sentido de se declarar uma variável sem defini-la?

1. Qual o sentido de se declarar uma variável sem defini-la?

Perfil removido
removido

(usa Nenhuma)

Enviado em 14/07/2018 - 09:03h

Eu entendo que as vezes é necessário apenas declarar uma função ao invés de defini-la, mas uma coisa que não entendo é fato de alguns headers por ai adotarem apenas a declaração de structs, enums ou até mesmo variáveis explicitamente com a classe de armazenamento extern.

Aqui vai um exemplo de header que faz isso que mencionei -> https://code.woboq.org/qt5/include/openssl/sha.h.html

Alguém sabe o motivo de adotar o uso de extern dessa maneira em variáveis e structs?


  


2. Re: Qual o sentido de se declarar uma variável sem defini-la?

Paulo
paulo1205

(usa Ubuntu)

Enviado em 14/07/2018 - 20:11h

Ali não se tem uma declaração de variáveis externas, mas uma diretiva que orienta o compilador C++ a entender que as declarações contidas naquele bloco seguem as regras do C, não as regras do C++.

Por que isso? Porque a maneira como o C++ implementa sobrecarga de funções é por meio de alterações nos nomes internos de funções (presentes nos códigos objetos, gerados pelo compilador e consumidos pelo linker), por meio de sufixos que são colocados após os nomes que aparecem nas declarações, e que refletem os tipos dos parâmetros que tais funções recebem. O C não tem sobrecarga de funções, então não usa tais sufixos, e a forma pela qual você diz ao compilador C++ que as declarações se referem a símbolos em C é precedendo cada uma dessas declarações ou envelopando um conjunto de declarações em um bloco precedido por “extern "C"”.

Note que “extern "C"” é uma forma válida apenas na compilação em C++, não na compilação em C. É por isso que ela é cercada por blocos de “#ifdef __cplusplus” e “#endif”.


3. Re: Qual o sentido de se declarar uma variável sem defini-la?

Paulo
paulo1205

(usa Ubuntu)

Enviado em 14/07/2018 - 21:32h

Outra ciosa distinta seriam as declarações de símbolos (particularmente variáveis) que especificam que a ligação (linkage) entre o símbolo e o programa deve ser externa.

Tal tipo de declaração funciona tanto em C quanto em C++, e seu efeito é fazer com que o compilador não espere que a definição do valor do símbolo ocorra dentro do arquivo/módulo que está sendo compilado, mas que deva ser buscado pelo linker em outro lugar, tal como uma biblioteca ou arquivo objeto compilado separadamente.

No caso de funções, o default é ter ligação externa. Para variáveis, a regra é um pouco diferente: para todas as variáveis estáticas que não sejam explicitamente declaradas como extern ou com uma atribuição de valor explícita no momento da declaração, o compilador providencia um valor default nulo no momento da declaração. Se, no entanto, você a declarar como extern, você não pode atribuir um valor, e o compilador entende que aquele nome de variável é válido, embora seu valor e o endereço onde essa variável reside ainda não sejam conhecidos. Quando o linker for invocado, ele terá de resolver o endereço, a partir de uma definição contida em algum outro código objeto especificado para ligação. Se tal definição não for encontrada, o linker vai emitir o erro de “undefined reference” (ou equivalente no mundo Windows) em referência a essa variável.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts