[ LUGOS-PROG ] C - const

Goran Bervar goran.bervar at adapti.si
Sun May 27 16:30:51 CEST 2001


const (in volatile) se uporabljata predvsem za to, da je koda bolj "varna"
in te zaščiti
pred nepričakovanimi rezultati. (Ker imata podoben (a ne identičen) pomen ju
v C in C++ standardu ju pogosto okrajšajo z izrazom cv-qulaifier).

Vsaka spremenljivka, ki je tipa 'const', se obanaša kot konstanta v dosegu,
kjer je deklrarairana. Po eni strani to preprečuje, da bi ji ti kot
programer pomotoma spremenil vrednost, po drugi pa pove tistemu, ki jo
uporablja , da se ne bo spremenila vsebina te spremenljivke.

V C funkcijah se uporablja skoraj izjemoma skupaj s kazalci, medetem ko ima
v C++ mnogo več pomenov in se uporablja vsevprek.

Na tvojem primeru:

void funkcija(const FILE *fd, const char *string, const int cc);
void funkcija_nc(FILE *fd,char *string, int cc);

1. deklaracija pove, da 'funkcija' zagotovo ne bo spremenila _vrednosti_, na
katere kažeta kazalca fd, in string, medtem ko je zadnja deklaracija 'const
int cc' skoraj zagotovo odveč (čeprav ne napačna), ker bo se bo za argument
cc tako ali tako naredila kopija in funkcija ne more spremeniti orginalne
vrednosti.

Za konstanten argument lahko uporabiš tako ne-konstantno spremenljivko kot
konstantno spremenljivko. Po domače, vedno lahko "dodaš" konstantnost,  ne
moreš pa je enostavno odvzeti. na primer:

const char fname[]={"To je niz".};
char* pname = (char*)malloc(strlen(fname)+1);
strcpy(pname,fname);

funkcija("mojad", /*itd. */); /* OK */
funkcija(fname, /*itd. */); /* OK */
funkcija(pname, /*itd. */); /* OK */

funkcija_nc("mojad", /*itd. */); /* error - can not cast const char* to
char* */
funkcija_nc(fname, /*itd. */); /* error - can not cast const char* to char*
*/
funkcija_nc(pname, /*itd. */); /* OK */

Kolikor je meni znano z vidika hitrosti klicanja v "čistem" C-ju ni nobenih
sprememb. Izjemoma je to v kakšnem sistemu celo mogoče - mogoče kak
prevajalnik optimira take klice - ampak to je prej posebnost kot pravilo.
Glede hitrosti si mogoče naletel na informacijo, da je bistveno hitreje
prenašati konstatni kazalec na strukturo kot pa kopijo strukture. To pa je
seveda logično.

Kar nekaj programerjev ignorira 'const' in se potem čudi, zakaj se programi
obešajo. Zato se vedno splača dobro premisliti, in če ni razloga proti,
uporabti const čim bolj pogosto.

goran

----- Original Message -----
From: "Rok Papež" <rok.papez at kiss.uni-lj.si>
To: <lugos-prog at lugos.si>
Sent: 26. maj 2001 14:34
Subject: [ LUGOS-PROG ] C - const


> Živjo!
>
> Zanima me kaj naredi izraz 'const' v Cju pri podajanju parametrov.
>
> Konkretno, kaj je razlika med:
> void funkcija(const FILE *fd, const char *string, const int cc);
> void funkcija(FILE *fd,char *string, int cc);
>
> Se mi zdi namrec, da sem nekje zasledil, ce ne spreminjas parametrov v
> funkciji se s 'const' zadeva baje bolj optimalno prevede. True ?
> Bulls***?
>
> --
> best regards,
> Rok Papež.
>





More information about the lugos-prog mailing list