[C++] zasto je bitno koristiti anonimous namespace

  • Začetnik teme Začetnik teme bmaxa
  • Datum pokretanja Datum pokretanja

bmaxa

Legenda
Poruka
70.808
Elem izgubio sam vise sati pre jedno godinu dana na debagovanje "duhova" zbog toga sto
privatnu srtukturu nisam stavio pod namespace {}.
Elem. struct Data{ pa tu nesto } defnisano u cpp fajlu.
I nista globalno definisano sve void f(){ Data d;... }
I gle puca program na sve strane, debager, pokazuje gluposti nista jasno.
I onda pogledam ms dns headere. Ladno void dnsf(Data*) na pr.
Sta to znaci: forward deklaracija a implementacija u nekom ms dll-u.
I sta se desava? ms linker umesto sa mojom Data linkuje sa ms ovom data :P
I eto, samo da kazem, desi se da neko cesto koristeno ime neko drugi na pr ms
ubaci u svoj lib, i eto skoro neotkrivi bug. Dakle sve sto ide u cpp fajl
obavezno pod namespace :P
 
Да покушам да помогнем, ризикујуће да не будем у праву јер С-ичне програмске језике обилазим у широком кругу.

Рецимо, да је нека функција дефинисана у dll-у, како ти кажеш имплементирана. Компајлер преводи све фајлове које чине један пројекат, па и dll. Али када треба да направи код позива поменуте функције из dll-а он не зна ништа о тој функцији, па је потребно да на том месту те информације постоје. Зато треба да постоји forward декларација само заглавља те функције без дефиниције (имплементације) која може бити у том С фајлу или у његовом .h фајлу.

Пошто С користим само за програмирање микроконтролера за које нису потребни неки захтевни програми, а за све остало неки паскалични програмски језик, можда сам промашио тему, али имао сам вољу да помогнем.
 
Да покушам да помогнем, ризикујуће да не будем у праву јер С-ичне програмске језике обилазим у широком кругу.

Рецимо, да је нека функција дефинисана у dll-у, како ти кажеш имплементирана. Компајлер преводи све фајлове које чине један пројекат, па и dll. Али када треба да направи код позива поменуте функције из dll-а он не зна ништа о тој функцији, па је потребно да на том месту те информације постоје. Зато треба да постоји forward декларација само заглавља те функције без дефиниције (имплементације) која може бити у том С фајлу или у његовом .h фајлу.

Пошто С користим само за програмирање микроконтролера за које нису потребни неки захтевни програми, а за све остало неки паскалични програмски језик, можда сам промашио тему, али имао сам вољу да помогнем.
Pazi radi se o tome sto linker trazi definiciju strukture u libu. MS *ne koristi namespace* i tu je problem.
Dakle postoji simbol Data u mom obj fajlu i postoji simbol Data u MS dll-u. Njhova definicija moze da pokarabasi
moj kod, zato sto linker trazi definiciju u ms dll-u, i *prvo je tamo nadje*, a moze i suprotno, da moj obj
fajl pokarabasi ms kod zato sto nije linkovao sa njihovom definicijom :P
Dakle, namespace{} ne radi nista drugo nego sto na Data dodaje @skrljbrlj generisano unikatno, tako da
nema clash-a sa ms strukturom. Ne bi bilo problema da je ms Data C kod, zato sto C++ sam za sebe
mengluje da bi se razlikovao od C struktura, ali ms je to iskompajlirao *istim* C++ kompajlerom i napravio problem:P
 
Pazi radi se o tome sto linker trazi definiciju strukture u libu. MS *ne koristi namespace* i tu je problem.
Dakle postoji simbol Data u mom obj fajlu i postoji simbol Data u MS dll-u. Njhova definicija moze da pokarabasi
moj kod, zato sto linker trazi definiciju u ms dll-u, i *prvo je tamo nadje*, a moze i suprotno, da moj obj
fajl pokarabasi ms kod zato sto nije linkovao sa njihovom definicijom :P
Dakle, namespace{} ne radi nista drugo nego sto na Data dodaje @skrljbrlj generisano unikatno, tako da
nema clash-a sa ms strukturom. Ne bi bilo problema da je ms Data C kod, zato sto C++ sam za sebe
mengluje da bi se razlikovao od C struktura, ali ms je to iskompajlirao *istim* C++ kompajlerom i napravio problem:P
Нажалост због оваквих ствари, али и многих других одавно сам одлучио да у С-ичним програмима радим само када морам, када нека муштерија запне да мора тако. Та ситуација да нешто под истим именом на истом нивоу важења може да буде два пута дефинисано ми диже косу на глави.

Дижем и руке, не могу бити од помоћи.
 
Нажалост због оваквих ствари, али и многих других одавно сам одлучио да у С-ичним програмима радим само када морам, када нека муштерија запне да мора тако. Та ситуација да нешто под истим именом на истом нивоу важења може да буде два пута дефинисано ми диже косу на глави.

Дижем и руке, не могу бити од помоћи.
Znas kako, nisi programirao u asembleru :P
C/C++ je povetarac kako izgleda programirati nesto vece u asembleru :P
 
Poslednja izmena:

Back
Top