[ leka @ 20.01.2002. 17:26 ] @
... moram priznati da nekada ne razumem neke ljude. :) Ne moze covek uvek da se 100% posveti onome sto pise, kesiranje je jedna od najglavnijih stvari za sta je #pragma koristi... Ja nisam rekao da se #pragma koristi samo za to. Ako sam rekao onda je to moja greska koja se takodje da objasniti - ja ne sedim ovde i cekam da odgovaram ljudima na pitanja. :) Odogovorim na brzaka uvek.

Elem sada da dam svoj "pogled" na #pragma direktive (mada opet isticem da to nije kompletno objasnjenje #pragma direktiva!):

Pragma direktive se koriste NAJCESCE da kontrolisu akcije kompajlera u odredjenom delu programa ali tako da ne uticu na sam program u globalu. #pragma direktive stavljamo u C++ kod onde gde zelimo da one naprave neki "uticaj" da to tako nazovem :) . #pragma direktiva utice na aplikaciju od mesta poziva nadalje za vreme kompajliranja ILI dok se ne naidje na drugu #pragma direktivu - koja AUTOMATSKI menja status prethodne!

Sintaksa je kao sto znate:
Code:
#pragma pragma-string


pragma string moze da bude:
COPYRIGHT -- da specificirate kopirajt informaciju
COPYRIGHT_DATE -- da specificirate datum za prethodno opisanu informaciju o kopirajtu
hdr_stop -- kada se koristi kesiranje raznih header-a ova "komanda" se koristi da se naznaci KRAJ "prefix header" dela programa. U datom sors fajlu ovaj header ne moze da se resetuje!
HP_SHLIB_VERSION -- Da se kreira verzija rutine iz dinamicke biblioteka.
LOCALITY -- Da se nazove tzv. "code subspace"
OPTIMIZE -- Da se ukljuci ili iskljuci optimizacija
OPT_LEVEL -- Da se setuje odredjeni nivo optimizacije
pack -- da dozvoli da maksimalni "alignment" delova klase moze da ima i non-class tipove...
VERSIONID -- Da se specificira string koji predstavlja verziju...

Kako Ivan rece, #pragma sluzi za svasta - ovo sto sam ja u prethodnim redovima naveo je samo deo #pragma direktiva... Ja ne verujem da ljudi nesto mnogo koriste #pragma direktive (zato sam i reagovao onako na pocetku, jer se #pragma najvise koristi da se naglasi koji headeri se kesiraju a koji ne - najcesce...)

PONAVLJAM: #pragma utice samo na delove programa! Ili, utice od mesta gde se pozove, pa do kraja kompajliranja!
Evo primera

Code:

g++ -O2 prog.cc

------------8<-----(prog.cc)-------
#pragma OPTIMIZE OFF
void A(){    // Iskljuci optimizaciju
    ...      // za ovu funkciju
}

#pragma OPTIMIZE ON
void B(){    // Vrati optimizaciju
    ...      // na nivo 2.
}
------------>8------------


Huh, odo da popijem nesto, tj. ne nesto nego jedan Heineken iz friza...

Pozdrav svima, a najvise pozdrava mojoj METAL bratiji sirom sveta! ;)

Dejan Lekic
dejan ? metal.org.yu
http://www.1inux.org
[ Ivan Dimkovic @ 21.01.2002. 19:03 ] @
Ja mislim da bi pragme trebalo u nacelu izbegavati, jer one dovode do nekompatibilnosti medju razlicitim kompajlerima (o arhitekturama da ne govorim ;)

Postoji nekoliko karakteristicnih situacija gde pragma moze da koristi, kao sto Leka pomenu - OPTIMIZE (ON/OFF) - neko bi se pitao zasto bi se gasila optimizacija kompajlera? Postoje odredjeni slucajevi (retki, doista, ali postoje) gde kompajler moze da pobrljavi i da generise kod sa greskama (ranije versije MSVC++ kompajlera, neke verzije GNU C kompajlera, itd..) - jedno od resenja koje se primenjuje "samo da program proradi" je iskljucivanje optimizacije preko #pragme - da bi se stigao rok, na primer - a kasnije se gleda sta i kako raditi kako bi se problem eliminisao :)

Druga primena, isto vrlo interesantna, je gasenje nekog warning-a u odredjenom fajlu - na primer, ako koristite neke automatski generisane tabele sa floating pointovima i kompajler vas casti sa bezbroj "warning - conversion from float to double, possible loss of data" - to jedan warning disable pragma na pocetku fajla resava za par sec :) Opet... bolje je to rucno izmeniti, ali ako se nema vremena...