C++ - Aký majú význam "podtržítkové" funkcie?
Prečo sa identifikátory mnohých funkcií v C++ začínajú podtržítkami (_)? Aký to má vlastne zmysel? Podľa mňa to dosť zneprehľadňuje kód v zdrojovej podobe. Veď napríklad je try a __try pre VCL? Prečo je C++ také rozdrobené a zneštandardizované? Chápem, že je to pre maximálne využitie možností aktuálneho systému, ale načo try a __try? Taktiež mnohé funkcie v BC++ 3.5 pre DOS boli riešené s potržítkom, ak sa jednalo o typ premennej s väčšou dĺžkou v pamäti. Prečo to nemôže byť ako napr. v Pascale, kde pre všetky typy premenných funguje jedna funkcia, napr. GetTime? Ekvivalent pre BC++ 3.5 je GetTime a _DOS_GetTime. Prečo je to takto sťažené? Veď C++ oficiálne umožňuje viacnásobnú deklaráciu funkcie s inými parametrami.
No to nevím, ale po přečtení tvého příspěvku jsem si okamžitě vzpomněl na písničku "Prečo je to tak" od skupiny Iné Kafe.
A tak poslouchám na plné pecky: Navyše príde deň kedy si odpoviem na všetky otázky ktorým nerozumiem...
Napriklad ohledne tech exceptions... je to tak, ze mas na vyber nekolik mechanismu osetreni vyjimek.
Jeden je definovany v C++ od Stroustrupa a pouziva "try", "catch" a "throw". Ve vetsich projektech ma ale celkem velkou rezii a zpomaluje.
Pak existuje efektivnejsi zpusob, ktery je "zapusten" do woken - ten pouziva "__try", "__except" a "__finally"
Pak jsou jeste MFC exceptions, ale ty sem ted netahejme..
Protoze uvedene zpusoby jsou na sobe nezavisle (dokonce by se mohly i kombinovat, i kdyz je to vetsinou blbost), jsou proste odliseny tema podtrzitkama - a ty oficialni dostaly prednost.
U jinych funkci maji podtrzitka zase jine duvody - treba se tak oznacuji nestandardni nazvy funkci ve standardnich knihovnach, nebo funkce ktere je mozne nahradit makrem...
Dobre, takže tomu povedzme, že rozumiem. Ale prečo teda niečo podobné nie je v Pascale a Object Pascale? Pri C je to spôsobené aj tým, že C je multiplatformový jazyk a teda aby ostala multiplatformnosť zachovaná, tak sú odlišné príkazy s podtržítkom. Ale napr. v Delphi sú komponenty CLX pre zachovanie multiplatformnosti, ale podtržítka nikde. Ako je to teda riešené tam?
Aka multiplatformost Delphi??? Ja som teda este nevidel delphi na nejakom DEC, G5, MacOS alebo Unixe. Existuje?
P.S. snazime sa ti vysvetlit ze sa jedna o odlisenie dvoch roznych veci. Mohlo by sa to volat aj
try1 catch1
try2 catch2
mne sa zda lepsie podtrzitko...
Ak delphi vie len jeden sposob, tak nemas podtrzitka, ale to to je problem delphi ze je obmedzeny.
A nebylo by lespi vzhledem k multiplatformovosti mit jednu funkci, ktera by vyuzivala prostredky nejake vrstvy, ktera kod napasuje na platformu nez mit ruzne pojmenovane funkce, ktere delaji stejnou funkci ?
Tohle prece neni o multiplatformnosti - nebo aspon jsem jeste myslim nevidel, aby byly nekde ruzne platformy odlisovany podtrzitkama. Pokud vim, standardne se pro tohle pouzivaji obycejna makra, takze jedna funkce ma pro ruzne siroke argumenty, dokonce i pro ruzne typy znaku (a unicode) i pro jine procesory stejnou syntax. Podtrzitka se pouzivaji asi z dvaceti ruznych duvodu, ale ne kvuli odliseni platforem. Je fakt, ze nekdy se tam dostanou jako "docasne" ad-hoc reseni a pozdeji zmizi, jindy zustanou... Asi nejsou esteticky nic moc, ale vzdycky nejaky duvod maji. Vsak si to vyguglujte, ja to sem pisu trochu krkolome z pdacka pres ts...
Rozne pomenovane fcie nedelaji stejnou funkci. Aj rovnaka vec sa da urobit viacerymi sposobmi, a kazdy sposob moze mat ine nevyhody, ak mas moznost pouzit viac roznych sposobov ako urobit rovnaku vec, je to IMHO vyhoda, nie? V tomto pripade nejde o multiplatformost, ide o moznot urobit jednu vec na jednej platforme dvomi roznymi sposobmi.
Co sa tyka MS VC++ tak si MS asi povedal ze urobi rozsirenejsie ale podobne fcie napr. k fcii open tak nadrbal do nazvu podtrzitko (_open, http://msdn.microsoft.com/library/default.asp?url=/ library/en-us/vclib/html/_crt__open.2c_._wopen.asp), potom bud mapuje v headri nazov "open" na spravnu fciu podla toho ci unicode, tchar, a podobny bordel, alebo open vobec nedefinuje a pri portovani clovek vidi ze aha pozor windows ma bordel v znakoch (1byte vs. 2byte character, apod.).
BTW. zaoberat sa nazvami fcii/makier je IMHO dost divne (ako som pisal moze si to nazvat ako chce cez #define).
A k čomu je potom to CLX?
Edit:
SubChild.asp
Akoze vyvinut dnes kniznicu Win+Linux mozes aj pre vyvojove prostredie C/C++, a aj take kniznice existuju. Win+Lin nejako moc nepovazujem za multiplatformnost, az sa bude v Delphi programovat mikrokontroller v TV, tak bude Delphi multiplatformny
To nie je problem C ani C++, ale je to zalezitost tvojho vyvojoveho prostredia a jeho kniznicnych funkcii (a stupna opitosti autora tej ktorej kniznicnej funkcie).
Podtrzitko odlisuje fciu od originalu, ale vyzera ako original, preco sa nepouzije originalny nazov - asi za prve kvoli tomu aby ked portujes nejaky program z inej platformy ti to na tej fcii skoncilo s chybou prekladu a clovek vie ze na tejto platforme je tam nieco nestandardne, alebo v tvojom pripade toho _DOS_gettime zrejme islo o to ze tie dve fcie robia to co robia mozno inym sposobom (jedna vola fciu DOSu a druha zistuje cas mozno nejako inac), a teda logicky chces mat moznost volby ktory sposob je ti vyhodnejsi. A ak by ti bolo malo mohol by si si ´naprogramovat aj tretiu fciu, _Windows_GetTime() , alebo aj dalsich milion modifikacii.
Ak sa ti tie nazvy nepacia, C/C++ ti dovoluje zadefinovat si nazvy funkcii ake chces, napr. Marta1(), Marta2(), , napr. cez #define (co aj dost pouziva mrkvosoft vo vc++ headroch).