Page 1 of 1

Taigi #define ir const

Posted: 2013 Jul 28 16:27
by xFrostas
Norėčiau daugiau sužinoti apie tai kur kurį yra efektyviau/geriau naudoti, buvau radęs šitame forume kažką panašaus. Tai paaiškinkit jei galit.

Re: Taigi #define ir const

Posted: 2013 Jul 29 19:06
by aaarnas
#define yra preprocesorius apdorojamas kompiliatoriaus.
Tai yra savotiškas "replace".

Esmė ta, kad preprocesoriai yra apdorojami dar prieš sukompiliuojant. Sukompiliuotame plugine tiesiog su define aprašytos reikšmės yra įkeliamos į tas vienas, kur jis panaudotas.

Tarkim yra:

Code: Select all

#define AMOUNT 5set_user_health(id, AMOUNT)
Sukompiliuotas kodas atrodys taip:

Code: Select all

set_user_health(id, 5)
const kintamasis yra konstanta. Konstanta - reikšmė, kurią galima tik skaityti, negalima jos redaguoti. const kintamasis per jo inicializaciją įgauną reikšmę ir bet koks bandymas priskirti kažkokią reikšmę tam kintamajam sukels kompiliavimo klaidą.

Skirtumas būtų tas, kad const kintamasis yra normalus kintamasis. Jam yra išskiriama 4 baitai ram atminties ir papildoma eilutė kodo segmente inicializuojanti kintamąjį ir jo reikšmę.
define - tiesiog reikšmė įrašyta funkcijoje.

Apskritai, nematau tikslo Pawn kalboje naudoti const kintamųjų. Jie naudingi nebent tik funkcijose, parametrus pažymint const, kurie neturėtų keistis pagal idėją, dėl aiškumo daugiau.

const pravartesnis yra tokiose kalbose kaip C, C++ ar Java final. Ten kartais naudinga pasidaryti const pointerius ar objekte turėti konstaninius laukus. Irgi daugiau dėl aiškumo ir saugumo.

Re: Taigi #define ir const

Posted: 2013 Aug 01 14:12
by hleV
[pawn]#define DEFINED_STRING "ilgas tekstas <...>"new const ALLOCATED_STRING[] = "ilgas tekstas <...>"; public client_PreThink(){    DoSomething("ilgas tekstas <...>"); // Sukuriamas masyvas laikyti tekstui.    DoSomething(DEFINED_STRING); // Tas pats kaip auksciau.     DoSomething(ALLOCATED_STRING); // Naudojamas jau sukurtas masyvas ALLOCATED_STRING.}[/pawn]