[ LUGOS-PROG ] C - const (fwd) [predlog za salcko]

Rok Krulec Rok.Krulec at acm.org
Wed May 30 10:54:24 CEST 2001


Tegale tipa predlagam, da ta mesec dobi salcko.

Portoroz, 30.May 2001 @ 10:49 CET

---------- Forwarded message ----------
Date: Sun, 27 May 2001 16:30:51 +0200
From: Goran Bervar <goran.bervar at adapti.si>
Reply-To: lugos-prog at lugos.si
To: lugos-prog at lugos.si
Subject: Re: [ LUGOS-PROG ] C - const

const (in volatile) se uporabljata predvsem za to, da je koda bolj "varna"
in te za=B9=E8iti
pred nepri=E8akovanimi rezultati. (Ker imata podoben (a ne identi=E8en) pom=
en ju
v C in C++ standardu ju pogosto okraj=B9ajo z izrazom cv-qulaifier).

Vsaka spremenljivka, ki je tipa 'const', se obana=B9a kot konstanta v doseg=
u,
kjer je deklrarairana. Po eni strani to prepre=E8uje, 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=E8 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=BEeta kazalca fd, in string, medtem ko je zadnja deklaracija 'con=
st
int cc' skoraj zagotovo odve=E8 (=E8eprav ne napa=E8na), ker bo se bo za ar=
gument
cc tako ali tako naredila kopija in funkcija ne more spremeniti orginalne
vrednosti.

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

const char fname[]=3D{"To je niz".};
char* pname =3D (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 "=E8istem" C-ju ni noben=
ih
sprememb. Izjemoma je to v kak=B9nem sistemu celo mogo=E8e - mogo=E8e kak
prevajalnik optimira take klice - ampak to je prej posebnost kot pravilo.
Glede hitrosti si mogo=E8e naletel na informacijo, da je bistveno hitreje
prena=B9ati konstatni kazalec na strukturo kot pa kopijo strukture. To pa je
seveda logi=E8no.

Kar nekaj programerjev ignorira 'const' in se potem =E8udi, zakaj se progra=
mi
obe=B9ajo. Zato se vedno spla=E8a dobro premisliti, in =E8e ni razloga prot=
i,
uporabti const =E8im bolj pogosto.

goran

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


> =AEivjo!
>
> 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=BE.
>





More information about the lugos-bla mailing list