C avançat

La meva experiència amb cadells d’enginyers és que als coneixements que tenen els alumnes o, diguem-ne així, usuaris bàsics de C, cal afegir-los certs coneixements que no s’acostumen a donar enlloc.

Static

La primera característica estranya de C és la paraula reservada static, que sol portar a confusions. Aquesta paraula reservada indica coses diferents segons on es faci servir, bàsicament:

  • Si es fa servir en una declaració d’una variable dins d’una funció, farà que aquesta variable mantingui el seu valor després de cada crida a la funció.
  • Si es fa servir per declarar una variable fora d’una funció, aquesta variable només tindrà visibilitat dins el mòdul on s’està declarant.
  • Si es fa servir per declara una funció, aquesta funció només tindrà visibilitat dins el mòdul on s’està definint.

Veiem el primer cas amb un exemple. La funció declara dues variables, una amb static i l’altre sense.

void func() {
     static int counter = 0;
     int counter2 = 0;
     printf("Counters = %d ### %d\n", counter, counter2);
     counter++;
     counter2++;
 }

Les crides successives a la funció func() traurà el següent per la consola:

Counters = 0 ### 0 
Counters = 1 ### 0 
Counters = 2 ### 0

Perquè la variable counter està definida estàtica dins la funció i es manté el seu valor, mentre que la variable counter2 no ho està i es crea i destrueix a cada crida de la funció.

L’altra ús de la paraula static és quan es defineixen funcions en un mòdul, és a dir, en una parella de fitxers .c/.h. Si es defineix una funció de la següent manera no es podrà cridar fora del mòdul (fitxer) on s’ha definit. En aquest cas, la funció es defineix en el fitxer .c i no pas en el fitxer .h, ja que no es publica la seva existència a d’altres mòduls del projecte.

Fitxer modul.c

static int value = 0;

static void increment_value() {
   value++;
 }

Tant la variable value com la funció increment_value() només seran accessibles dins el mateix fitxer i no es podran cridar des de cap altre lloc.

Aquesta característica ens serveix per “amagar” funcions que no han de ser cridades des d’altres mòduls. Pels programadors que estiguin acostumats a la programació orientada a objectes, es pot veure que la paraula static serveix per declarar funcions equivalents als mètodes privats dins de les classes.

Const

L’altra paraula reservada que acostuma a portar a confusió és la paraula reservada const, Aquesta paraula també te diversos usos, segons on estigui col·locada, veiem el primer cas.

A l’hora de declarar variables, el que fa és declarar la variable com a constant, i que no pot ser modificada.

També serveix per declarar coses com punters constants a una variable, o punters constants a variables constants. Per exemple, el següent codi és vàlild, tot i que el compilador ens treu un warning:

const int a = 5;
int b = 10;
int *ptr;

ptr = &a; 
*ptr = 9;
printf("ptr: %d\n", *ptr);

I el resultat serà el valor 9, ja que a través del punter es modifica el valor de la variable a. En canvi, l’assignació directa a la variable a (a = 7) ens donaria un error de compilació.

També es pot escriure el següent codi:

int a = 5;
int b = 10;
int *const ptr = &a;

*ptr = 9; 
printf("ptr: %d\n", *ptr);

En aquest cas, no es podrà modificar a on apunta l’apuntador ptr, però si es pot modificar el valor de la variable a la que apunta. Per tant, enmig del codi, l’assignació ptr = &b, donaria error per part del compilador.

Hi ha més combinacions, us les deixo com exercici entendre què son i per a què poden servir:

int a = 5;
const int &ptr1 = &a;
int *const ptr2 = &a;
int const * ptr3 = &a;
const int * const ptr4 = &a;

L’altre ús de la paraula reservada const és a l’hora de definir paràmetres d’una funció. Es pot fer servir per indicar si el paràmetre que es passa per referència pot ser modificat dins la funció o si pel contrari, s’assegura que no es modificarà.

Per exemple podem tenir la següent definició de funció

void func(int const * a);

Que indica que el valor de l’apuntador a enter que es passa com a primer paràmetre no serà modificar dins de la funció. Això pot ajudar tant al desenvolupador que està escrivint la funció a no cometre cap errada i a qui faci servir la funció per saber si algun dels paràmetres pot ser modificat.

Anuncis

Deixa un comentari

Fill in your details below or click an icon to log in:

WordPress.com Logo

Esteu comentant fent servir el compte WordPress.com. Log Out /  Canvia )

Google photo

Esteu comentant fent servir el compte Google. Log Out /  Canvia )

Twitter picture

Esteu comentant fent servir el compte Twitter. Log Out /  Canvia )

Facebook photo

Esteu comentant fent servir el compte Facebook. Log Out /  Canvia )

S'està connectant a %s

Aquest lloc utilitza Akismet per reduir els comentaris brossa. Apreneu com es processen les dades dels comentaris.