среда, 8. април 2009.

конст коректност 2


Интересантност о којој до данас нисам мислио. Колега ми је отворио очи. Наиме, ради се овоме: колега је послао фајл са Ц кодом на преглед. Његов код је имао функције које су изгледале отприлико овако:


/* Primer const argumenta u definiciji. */
static int foo(const int bar)
{
if (bar > 7)
global_bar = bar - 7;
}


На то сам ја коментарисао да обично не "губим" време декларишући формални аргумент конст, на шта ми је одговорио (потпуно исправно) да је у дефиницији конст врло корисна, за разлику од декларације.

Конст формални аргумент у декларацији сам коментарисао, али ја лично никада нисам размишљао о томе да дефиниција може да дода модификатор конст формалном аргументу, а да тиме не дефинише неку нову функцију.

На пример, нека је у заглављу оваква декларација:


/* Deklaracija funkcije. */
int funkcija(const char *);


А имплементација може овако:


/* Definicija funkcije. */
int funkcija(const char * const ime)
{
// ...
}


Заиста, овако се кориснику функције (који обично гледа прототип декларисан у заглављу) не намеће имплементациони детаљ за њега (корисника) небитан, док се читаоцу имплементације одмах даје до знања да се вредност формалног аргумента "ime" неће мењати у телу функције. Дакле, даје читаоцу сличну информацију као и конст модификатор на локалној варијабли.

Даље је интересантно приметити да додавање конст модификатора формалном аргументу у декларацији у суштини не мења декларацију. На пример, ове две декларације декларишу исту функцију.



/* Ekvivalentne deklaracije funkcije. */
int funkcija(const char *);
int funkcija(const char *const);



Oва друга је очигледно рогобатнија и представља једну од оних декларација у којима сам причао и у претходном чланку.

Нема коментара:

Постави коментар