Variáveis mesmo globais em C/C++

ngm

Power Member
Olá,

Eu estou a trabalhar num projecto de média complexidade em C/C++ e estou com uma pequena dúvida. Parece-me simples.

Portanto, o projecto é constituído por diferentes ficheiros .cpp: A.cpp, B.cpp, C.cpp, Main.cpp.

E um ficheiro .h por cada .cpp: A.h, B.h, C.h, Main.h.

O Main.h faz #include de todos os headers e cada um dos ficheiros .cpp faz #include do Main.h por forma a ficarem as dependências todas bem resolvidas.

Cada ficheiro .cpp contém a declaração de variáveis globais ao ficheiro e a declaração das funções relacionadas com o ficheiro.

Por exemplo, o ficheiro A.cpp contém as variáveis int a_var1, int a_var2,... e as funções a_func1(), a_func2(),...

O ficheiro B.cpp contém as variáveis int b_var1, int b_var2,... e as funções b_func1(), b_func2(),...


O meu problema é que no ficheiro C.cpp eu pretendo fazer uma função c_func1() que no seu corpo chama e altera a variável a_var1. Ora, esta variável está definida no ficheiro A.cpp e logo dá erro.

Será que alguém me pode indicar como deverei declarar uma variável que é mesmo, mesmo global e cujo scope não é do ficheiro mas sim de todo o projecto?

Muito obrigado! ;)
 
As variaves estão declaradas nos .h como private ou public?

penso que public poderias aceder por fora, não tenho a certeza (tou uma beka enferrujado :D)
 
Variáveis globais tem muito que se diga...

Se é um projecto relativamente complexo, porque não uma abordagem OOP com métodos definidos para o efeito?

De qualquer forma declaras normalmente num ficheiro e nos outros usas extern.
 
Pois... de facto, se fosse uma abordagem em C++ declararia as variáveis nos headers como private e definiria funções-membro de set() e get() que me devolveriam e alterariam o valor das variáveis.

O problema é que o projecto é em OpenGL e os exemplos do prof seguem uma abordagem procedimental em C (se bem que utilizem certas classes pré-feitas em C++ também) e estou a construir o meu projecto sobre o exemplo do prof, pelo que não me queria estar a meter em classes.

Deste modo, as variáveis estão definidas nos ficheiros .cpp.

Vou procurar mais informação sobre o extern. Obrigado.
 
O meu conhecimento de C++ está um bocado enferrujado, mas quanto a C posso-te garantir que não há coisa como variáveis globais ao ficheiro e a todo o projecto. Uma variável ou é global ou é local (ok ok, também há variáveis locais com armazenamento igual ao global mas não compliquemos).

Se metes duas variáveis com o mesmo nome em ficheiros diferentes, a coisa trabalha se os ficheiros não forem linkados. Se tentares linkar dois object que têm lá definido o mesmo símbolo, ele diz-te logo que está a haver redefinição do símbolo.

Como já foi sugerido, usar a keyword extern é uma solução. A keyword extern indica que uma variável é declarada algures noutro ficheiro.

Cumps,
 
Última edição:
Boas!

Dá uma olhada neste artigo :)

Aqui vais encontrar um exemplo que usa o #ifdef, podes criar um ficheiro (módulo) para as tuas variáveis "globais" e fazeres include das mesmas usando estes scripts. Acho que é a forma mais simples de fazeres isso caso tenhas de andar com muitas variáveis atrás. Atenção que isto só resulta para constantes! Se quiseres mesmo levar valores tens de improvisar de outra forma que sinceramente não me está a ocorrer como :(

abraços, HecKel
 
no c.cpp fazes: extern int a_var1; e assim ja a podes aceder no c.cpp

mas atenção: usar variaveis globais é geralmente uma má ideia! num projecto relativamente pequeno ainda se pode controlar +/- o seu uso, mas num projecto ja de maior tamanho podem surgir bugs por causa disso mesmo (uma função que chama outra que chama outra que por si altera a var) e depois pra debug dá mais trabalho.

EDIT: so agora é que vi que o jaac já tinha dito pra usar extern, my bad.
 
Última edição:
básicamente é assim num dos headers vais ter k por

extern int a_var1;


no teu a.cpp
vais ter

int a_var;


no teu outro ficheiro
de onde keres aceder á varivel a_var1 fazes include do header.

isto se eu não tou enferrugado demais ^^

básicamente o teu problema é de organização de código alguns programadores gostam de ter 2 ficheiros para as variáveis globais um global.h e um global.cpp

onde no global.h metem a declaração "extern" das variáveis e no global.cpp metem a actual definição.

De ***** forma se não souberes o k o extern faz e o pk de ele tar a ser usado. consulta este link k te dá toda a informação de aprenderes os "common pifalls" relativamente a uma má organização de código.

http://www.gamedev.net/reference/programming/features/orgfiles/page4.asp
 
Back
Topo