zz912 píše: ↑16. 1. 2024, 7:32
...
Potřebuji eportovat proměnou "int halui_sent_mdi" z halui.cc do emctaskmain.cc.
...
Ta otázka je nesmyslná (promiň). Nic takového, jako exportování, v c-čku neexistuje. Mimochodem, ty soubory se sice jmenují s příponou cc, ale jsou to ve skutečnosti c-čkové zdrojáky. C++ je nadmnožina c-čka. C-čkový program c++ překladačem a linkerem bez problémů přeložíš a slinkuješ.
Je třeba rozlišovat mezi deklarací a definicí. V .h jde o deklaraci a je to vlastně jen oznámení o existenci. V .c jde o definici a je to povel pro kompilátor, aby daný objekt uložil do object souboru pro linker, který pak přidělí místo v paměti.
Pokud je proměnná s nějakým jménem nadefinována v nějakém zdrojovém souboru (tedy .c nebo .cc) - (nikoliv v hlavičkovém - tam jsou jen deklarace, nikoliv definice), a je externí (extern, což je default), pak extern proměnnou se stejným jménem nelze nadefinovat v jiném linkovaném .c souboru. Ta proměnná je v celém programu pouze jediná. I když je její definice přinesena prostřednictvím object filu a máš k ní v čitelné formě jen deklaraci v nějakém hlavičkovém souboru.
Hlavičkové soubory slouží pouze jako deklarace. To znamená, že jen říkají, že proměnná s tímto jménem existuje a je někde (v .c souboru nebo linkovaném obj souboru, jde-li o knihovnu) nadefinována. Stejná proměnná může být deklarována klidně ve více .h souborech a vůbec to nevadí (pochopitelně musí být deklarována stejně, jinak kompilátor řve).
Takže, pro tvůj případ platí, že, pokud jsi nadefinoval v nějakém svém .c souboru danou proměnnou a linker neřval, pak jsi nelinkoval object file s původní proměnnou. Sice se to přeložilo, ale byla to jiná proměnná, než jsi očekával (byla to ta "tvoje"). Proto to nefungovalo.
Samozřejmě extern proměnnou můžeš normálně používat a i do ní zapisovat. Ovšem následky jsou nedefinované, protože nevíš, jak s ní zachází ten původní .c soubor (pokud k tomu nemáš zdrojáky a pracuješ jen s cizí knihovnou).