C/C++ globální proměnné (třída extern) – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

C/C++ globální proměnné (třída extern) – C / C++ – Fórum – Programujte.comC/C++ globální proměnné (třída extern) – C / C++ – Fórum – Programujte.com

 

Lukáš
~ Anonymní uživatel
301 příspěvků
6. 2. 2015   #1
-
0
-

Zdravím, v C/C++ jsem začátečník a potřeboval bych pomoct s pochopením globálních proměnných. Na netu je hromada příkladů a z nich mi přijde že to chápu, ale ve svém programu vidím, že nechápu :)

Zjednodušený příklad:

Mám jeden hlavičkový soubor (např. main.h) a pak soubor main.cpp, foo.cpp (k němu foo.h) a bar.cpp (k němu bar.h). Chci mít globální proměnnou glob, která bude přístupná ve všech třech .cpp souborech.

Hlavičkový soubor main.h includuji do všech .cpp souborů (ať už přímo nebo nepřímo). Takže právě sem bych umístil hlavní deklaraci: 

int glob;

Pak chci třeba v main.cpp ve funkci main() přiřadit hodnotu:

#include "main.h"

extern int glob;

void main() {
  glob = 21;
  ...
  // Pouzivani trid foo() a bar()
  ...
  return 0;
}

Už tady je problém - v takovémto případě mi to vyhodí třeba 5x multiple definition of glob.

A ve třídách foo() a bar() chci k proměnné taky přistupovat. Zkoušel jsem dávat: 

extern int glob;

jak do hlavičkových souborů foo.h a bar.h, tak do foo.cpp a bar.cpp NAD definice tříd foo() a bar().

Zkoušel jsem toho moc, ale i když se mi to nějak podařilo, tak mi to nedávalo smysl => potřebuji pochopit jak to funguje / jak to správně deklarovat, inicializovat a používat.

Nějaký dobrák co by mě to trošku vysvětlil? Na netu v příkladech většinou ukazují sdílení proměnné z jednoho souboru do druhého a to není úplně ono. Já potřebuji jednu globální definici a používat tu proměnnou v libovolném počtu souborů. V jedno jí třeba nastavím hodnotu a ostatní ji jen čtou - nebo třeba i mění - to už je jedno.

Nahlásit jako SPAM
IP: 212.4.134.–
KIIV
~ Moderátor
+43
God of flame
6. 2. 2015   #2
-
0
-

Do main.h das extern int glob;  - extern tvrdi linkeru, ze ve vysledku bude nekde promenna glob typu int, ale tady to zrovna neni.

Do main.cpp das  int glob = 0;  (globalne samozrejme, muze byt i bez hodnoty) - tuhle hodnotu by mel linker pak vsude provazat

Vsude jinde jen pouzivas promennou glob. Nikde uz nesmi byt  int glob;

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Lukáš
~ Anonymní uživatel
301 příspěvků
6. 2. 2015   #3
-
0
-

No v tom mám taky trošku binec. Někde se píše, že tam kde definuji globální proměnnou, tak dát extern int glob; a v ostatních souborech jen int glob; (např. teď Ty) a jinde zase naopak. V hlavním int glob; a v ostatních extern int glob (např. Pavel Herout).

Smysl by mě dávala spíš ta druhá varianta, ale zase třída extern určuje kam se proměnná uloží, ne? Takže by to IMHO mělo být použito jako první :/

Nicméně to, že to mám dát jen do mainu je pro mě novinka - ale smysl mě do docela dává. A kdybych to nechtěl v main.cpp, ale ve foo.cpp a bar.cpp jo, tak bych to nedal do main, ale musel bych to dát do obou souborů? A pokud jo, šlo by to dát místo těch dvou cpp souborů do foo.h a bar.h nebo to musí být v těch .cpp souborech?

Každopádně díky :)

Nahlásit jako SPAM
IP: 212.4.134.–
KIIV
~ Moderátor
+43
God of flame
6. 2. 2015   #4
-
0
-

extern rika prekladaci a linkeru, ze promenna bude definovana nekde jinde (pozdeji ci v jinem souboru ke slinkovani). Ale abys s ni mohl pracovat, tak musis mit deklaraci - tj. jeji nazev a typ.

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 92 hostů

Podobná vlákna

Globální proměnné — založil Anonymní uživatel

Globální proměnné — založil 3xore

Globální proměnné — založil Martin

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý