C/Variabili, operatori e costanti/Costanti
Esistono due tipi di costanti: le costanti manifeste (o letterali) e le costanti simboliche.
Costanti manifeste
modificaLe costanti manifeste si dichiarano nel seguente modo:
#define COSTANTE [sequenza_di_caratteri]
Ciò che si ottiene è la sostituzione nel sorgente del nome indicato con la sequenza di caratteri che lo segue. Si osservi l'esempio seguente:
#define SALVE Ciao, Come stai?
In questo caso viene dichiarata la costante SALVE in modo tale che tutte le occorrenze di questo nome, successive alla sua dichiarazione, vengano sostituite con Ciao! Come stai?. È molto importante comprendere questo particolare: tutto ciò che appare dopo il nome della macro, a parte lo spazio che lo separa, viene utilizzato nella sostituzione. Ecco un esempio:
#include <stdio.h>
#define SALVE "Ciao! Come stai?\n"
int main (void)
{
printf (SALVE);
}
In questo caso, SALVE può essere utilizzata in un contesto in cui ci si attende una stringa letterale, perché include gli apici doppi che sono necessari per questo scopo. Nell'esempio si vede l'uso della macro-variabile come argomento della funzione printf() e l'effetto del programma è quello di mostrare il messaggio seguente:
Ciao! Come stai?
È bene precisare che la sostituzione delle macro-variabili non avviene se i loro nomi appaiono tra apici doppi, ovvero all'interno di stringhe letterali. Si osservi l'esempio seguente:
#include <stdio.h>
#define SALVE Ciao! come stai?
int main (void)
{
printf ("SALVE\n");
}
In questo caso, la funzione printf() emette effettivamente la parola SALVE e non avviene alcuna espansione di macro:
SALVE
Una volta compreso il meccanismo basilare della direttiva #define si può osservare che questa può essere utilizzata in modo più complesso, facendo anche riferimento ad altre macro già definite:
#define UNO 1 #define DUE UNO+UNO #define TRE DUE+UNO
In presenza di una situazione come questa, utilizzando la macro TRE, si ottiene prima la sostituzione con DUE+UNO, quindi con UNO+UNO+1, infine con 1+1+1 (dopo, tocca al compilatore).
Tradizionalmente i nomi delle costanti manifeste vengono definiti utilizzando solo lettere maiuscole, in modo da poterli distinguere facilmente nel sorgente.
Come è possibile vedere meglio in seguito, è sensato anche dichiarare una macro senza alcuna corrispondenza. Nella definizione di una macro-variabile può apparire l'operatore ##, con lo scopo di attaccare ciò che si trova alle sue estremità. Si osservi l'esempio seguente:
#include <stdio.h>
#define UNIONE 123 ## 456
int main (void)
{
printf ("%d\n", UNIONE);
}
Costanti simboliche
modificaIn pratica si tratta di variabili a cui si applica il modificatore const. Ovviamente, è obbligatorio inizializzarla contestualmente alla sua dichiarazione. L'esempio seguente dichiara la costante simbolica e, il numero di Nepero:
const float e = 2.71828183;
Le costanti simboliche di questo tipo, sono delle variabili per le quali il compilatore non concede che avvengano delle modifiche; pertanto, il programma eseguibile che si ottiene, potrebbe essere organizzato in modo tale da caricare questi dati in segmenti di memoria a cui viene lasciato poi il solo permesso di lettura.