Definire variabile con #define

FemtoGinny
Salve people! La mia domanda semplice semplice è: nel linguaggio c, una volta definita una variabile a livello di precompilatore come per esempio #define N 100, è possibile eseguire delle operazioni su quest'ultima all'interno del codice sorgente? Per esempio incrementarla tipo N++ oppure sommarla a se stessa N+=N? Oppure rimane sempre e comunque fissa al valore assegnatole con la definizione?

Risposte
Sherlock.h
Con la direttiva del preprocessore #define di fatto definisci una costante, non una variabile!
Sostanzialmente a tempo di compilazione, a ogni elemento definito con #define viene sostituito il valore ad esso associato.
Fatto ciò il programma viene compilato normalmente.

Su wikipedia, a questo LINK c'è un esempio che renderà ciò che ho detto più chiaro.

A questo punto ti sarà chiaro che operazioni che modifichino il valore di un elemento definito con la direttiva #define non sono possibili. Puoi però compiere operazioni utilizzando le suddette costanti. A titolo di esempio, è del tutto valida un'espressione siffatta (con N definita con #define):

a=N+3*N+N/2;

FemtoGinny
Vero! *facepalm* pensandoci su 2 secondi in piu ho capito da sola che in effetti operazioni su costanti definite mom sono possibili xX ti ringrazio!

apatriarca
Una macro non è una variabile. Non è neanche una costante. Una macro non contiene alcun valore, è semplicemente un testo che viene inserito all'interno del codice sorgente quando il preprocessore lo incontra. Se all'interno del testo sostituito viene incontrato il nome di una macro, questa macro può essere ulteriormente sostituita all'interno del testo. Per esempio, nel seguente codice, CAT(FOO, BAR) viene convertito in FOOBAR (l'operatore ## concatena le due stringe passate come argomento) che quindi viene riscritto come 10.
#include <stdio.h>

int main(void)
{
    #define CAT(x, y) x ## y
    #define FOOBAR 10
    printf("%d\n", CAT(FOO, BAR));
}

Una macro non è necessariamente sempre la stessa comunque. Puoi per esempio avere qualcosa come:
#include <stdio.h>

int main(void)
{
    #define N M
    #define M 10
    printf("%d\n", N);
    #undef M
    #define M 11
    printf("%d\n", N);
}

In cui la stessa macro viene prima espansa in 10 e poi 11.

È in effetti possibile scrivere cose abbastanza complicate con le macro (avere quindi degli IF e dei FOR ad esempio), ma in generale è considerato cattiva programmazione farne uso. Sono in effetti abbastanza difficili da realizzare, comprendere e gestire.

FemtoGinny
Si, in effetti credo che quello che mi hai descritto sia a un livello di programmazione superiore al mio level noob xD comunque credo di averne in parte compreso il significato ^^ grazie per l'approfondimento :D

axpgn
@apatriarca
Quindi significa che il "pezzetto" CAT(FOO, BAR) è letto (elaborato) due volte? Se ci fosse un sola "passata" stamperebbe "FOOBAR" ...

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.