C Preprocessore e macro

In questo tutorial, verrai introdotto ai preprocessori c e imparerai a usare #include, #define e la compilazione condizionale con l'aiuto di esempi.

Il preprocessore C è un preprocessore di macro (consente di definire macro) che trasforma il programma prima che venga compilato. Queste trasformazioni possono essere l'inclusione di file di intestazione, espansioni di macro ecc.

Tutte le direttive di pre-elaborazione iniziano con un #simbolo. Per esempio,

 #define PI 3.14

Alcuni degli usi comuni del preprocessore C sono:

Compresi i file di intestazione: #include

Il #includepreprocessore viene utilizzato per includere file di intestazione nei programmi C. Per esempio,

 #include 

Ecco stdio.hun file di intestazione. La #includedirettiva del preprocessore sostituisce la riga precedente con il contenuto del stdio.hfile di intestazione.

Questo è il motivo per cui è necessario utilizzare #include prima di poter utilizzare funzioni come scanf()e printf().

È inoltre possibile creare il proprio file di intestazione contenente la dichiarazione di funzione e includerlo nel programma utilizzando questa direttiva del preprocessore.

 #include "my_header.h"

Visita questa pagina per ulteriori informazioni sull'utilizzo dei file di intestazione.

Macro che utilizzano #define

Una macro è un frammento di codice a cui viene assegnato un nome. È possibile definire una macro in C utilizzando la #definedirettiva del preprocessore.

Ecco un esempio.

 #define c 299792458 // speed of light

Qui, quando usiamo c nel nostro programma, viene sostituito con 299792458.

Esempio 1: #define preprocessore

 #include #define PI 3.1415 int main() ( float radius, area; printf("Enter the radius: "); scanf("%f", &radius); // Notice, the use of PI area = PI*radius*radius; printf("Area=%.2f",area); return 0; )

Funziona come le macro

Puoi anche definire macro che funzionano in modo simile come una chiamata di funzione. Questo è noto come macro di tipo funzione. Per esempio,

 #define circleArea(r) (3.1415*(r)*(r))

Ogni volta che il programma incontra circleArea(argument), viene sostituito da (3.1415*(argument)*(argument)).

Supponiamo di aver passato 5 come argomento, quindi si espande come di seguito:

 circleArea(5) expands to (3.1415*5*5)

Esempio 2: utilizzo del preprocessore #define

 #include #define PI 3.1415 #define circleArea(r) (PI*r*r) int main() ( float radius, area; printf("Enter the radius: "); scanf("%f", &radius); area = circleArea(radius); printf("Area = %.2f", area); return 0; )

Visita questa pagina per saperne di più sulle macro e sul preprocessore #define.

Compilazione condizionale

Nella programmazione C, è possibile indicare al preprocessore se includere o meno un blocco di codice. A tale scopo, è possibile utilizzare direttive condizionali.

È simile a una ifdichiarazione con una grande differenza.

L' ifistruzione viene testata durante il tempo di esecuzione per verificare se un blocco di codice deve essere eseguito o meno, mentre i condizionali vengono utilizzati per includere (o saltare) un blocco di codice nel programma prima dell'esecuzione.

Usi di condizionale

  • utilizzare un codice diverso a seconda della macchina, del sistema operativo
  • compilare lo stesso file sorgente in due programmi diversi
  • per escludere un determinato codice dal programma ma per mantenerlo come riferimento per scopi futuri

Come si usa il condizionale?

Per utilizzare condizionale, #ifdef, #if, #defined, #elsee #elseifvengono utilizzati direttive.

Direttiva #ifdef

 #ifdef MACRO // conditional codes #endif 

Qui, i codici condizionali sono inclusi nel programma solo se è definita MACRO.

#if, #elif e #else Directive

 #if expression // conditional codes #endif 

In questo caso, expression è un'espressione di tipo intero (può essere numeri interi, caratteri, espressioni aritmetiche, macro e così via).

I codici condizionali sono inclusi nel programma solo se l'espressione viene valutata su un valore diverso da zero.

La #elsedirettiva opzionale può essere utilizzata con la #ifdirettiva.

 #if expression conditional codes if expression is non-zero #else conditional if expression is 0 #endif 

Puoi anche aggiungere condizionale annidato al tuo #if… #elseutilizzo#elif

 #if expression // conditional codes if expression is non-zero #elif expression1 // conditional codes if expression is non-zero #elif expression2 // conditional codes if expression is non-zero #else // conditional if all expressions are 0 #endif 

#defined

L'operatore speciale #defined viene utilizzato per verificare se una determinata macro è definita o meno. Viene spesso utilizzato con la direttiva #if.

 #if defined BUFFER_SIZE && BUFFER_SIZE>= 2048 // codes 

Macro predefinite

Di seguito sono riportate alcune macro predefinite nella programmazione C.

Macro Valore
__DATE__ Una stringa contenente la data corrente
__FILE__ Una stringa contenente il nome del file
__LINE__ Un numero intero che rappresenta il numero di riga corrente
__STDC__ Se segue lo standard ANSI C, il valore è un numero intero diverso da zero
__TIME__ Una stringa contenente la data corrente.

Esempio 3: ottieni l'ora corrente utilizzando __TIME__

Il seguente programma emette l'ora corrente utilizzando la __TIME__macro.

 #include int main() ( printf("Current time: %s",__TIME__); )

Produzione

 Ora corrente: 19:54:39

Letture consigliate

  • Controllo di linea
  • Pragmas
  • Output del preprocessore
  • Altre direttive

Articoli interessanti...