Guida Linguaggio C: Le Direttive
2 Novembre 2007 C
   





Struttura di un Programma in C

La tipica struttura di un programma C è la seguente

program.c
  1. #include <xxxx.h>
  2.  
  3. direttive al preprocessore
  4.  
  5. definizione di costanti
  6.  
  7. definizione di tipi
  8.  
  9. definizione di variabili
  10.  
  11. prototipi di funzioni
  12.  
  13. funzioni
  14.  
  15. main()
  16. {
  17.  
  18. }

Inizialmente vengono inserite le eventuali direttive al preprocessore (tra cui la direttiva include). Quindi vengono inserite le eventuali definizioni di costanti, le definizioni di nuovi tipi, e le definizioni di variabili.
Non è necessario che tutte le dichiarazioni avvengano in questo ordine. Può benissimo essere che vi sia, ad esempio, prima una dichiarazione di tipo, poi una dichiarazione di variabile e quindi subito dopo una nuova dichiarazione di tipo. L'importante è che se in una dichiarazione si fa riferimento ad un tipo (o a una variabile o a una costante) questo sia stato precedentemente dichiarato.
Quindi vi saranno gli eventuali prototipi delle funzioni, le funzioni, e il main. 

Le Direttive al Preprocessore

Le direttive al preprocessore vengono solitamente inserite in testa al programma (ma possono trovarsi anche altrove, tra due funzioni, all'interno delle funzioni o del main) e vengono valutate in fase di compilazione dove vengono sostituite con del codice C appropriato.
Le direttive iniziano con il carattere # e non sono concluse da nessun simbolo (a differenza delle istruzioni in c che sono concluse con il ;). Su ciascuna riga non può esservi più di una direttiva.
L'elenco delle direttive presenti in C è il seguente: #if, #elif, #else, #endif, #define, #undef, #ifdef, #ifndef, #include, #line, #error, #pragma.

#if, #elif, #else, #endif

La struttura dell'if è la seguente

  1. #if espressione_costante
  2. ...
  3. #endif

Viene valutata l'espressione espressione_costante, se è vera il preprocessore effettuerà la trasformazione presente nel blocco dell'if, altrimenti non farà nulla. espressione_costante è una espressione logica che può contenere solo costanti predefinite quindi ne' variabili, ne' costanti definite tramite la const. La #endif termina la struttura if.
La struttura dell'if-else è la seguente

  1. #if espressione_costante
  2. ...
  3. #else
  4. ...
  5. #endif

Viene valutata l'espressione espressione_costante, se è vera il preprocessore effettuerà la trasformazione presente nel blocco dell'if, altrimenti il preprocessore effettuerà la trasformazione presente nel blocco else.
La struttura dell'if-elseif è la seguente

  1. #if espressione_costante
  2. ...
  3. #elseif espressione_costante
  4. ...
  5. #else
  6. ...
  7. #endif

la direttiva #elif coincide con la direttiva #elseif.
Esempio
  1. #define num 100
  2. ...
  3. #if num > 100
  4. printf("num > 100");
  5. ...
  6. #else
  7. printf("num <= 100");
  8. ...
  9. #endif

#define, #undef, #ifdef, #ifndef

La direttiva #define consente di associare ad un identificatore un valore. Il compilatore sostituirà ogni occorrenza dell'identificatore definito dalla #define con il valore associato.
La direttiva #undef consente di rimuovere l'associazione di un valore ad un identificatore effettuata in precedenza con la direttiva #define. La direttiva #ifdef verifica se un identificatore è stato definito in precedenza, coincide con la direttiva #if defined.
La direttiva #ifndef verifica se un identificatore non è stato definito in precedenza, coincide con la direttiva #if !defined.

  1. #define identificatore codice
  2.  
  3. #undef identificatore
  4.  
  5. #ifdef identificatore
  6. ...
  7. #else
  8. ...
  9. #endif
  10.  
  11. #ifndef identificatore
  12. ...
  13. #else
  14. ...
  15. #endif

Tramite la direttiva #define è anche possibile definire delle macro. Il preprocessore valuterà le macro e sostituirà i risultati ad ogni occorrenza.

  1. #define macro(parametri) corpo_macro



Esempio
  1. #define MODULO(x) (x)>0 ? (x) : (-x)
  2. ...
  3. ...
  4. printf("%d", MODULO(3));

#include

La direttiva #include consente di includere file. Il preprocessore sostituirà la direttiva include con l'intero contenuto del file da includere. In genere si tratta di file di intestazione (file .h).
Vi sono due possibili forme per la include

  1. #include <file1.h>
  2. #include "file2.h"

Nel primo caso il file file1.h si trova in una cartella nota al compilatore (ad esempio in visual c++ è possibile indicare in quali cartelle il compilatore deve andare a cercare i file da includere), nel secondo caso il file file2.h si trova nella stessa cartella del corrispondente file C, se il compilatore non trova file2.h in questa cartella lo va a cercare nella cartella nota al compilatore.

#line

La direttiva #line consente di modificare le macro __LINE__ che indica il numero di linea del programma.

#error

La direttiva #error sospende momentaneamente la compilazione per mostrare il messaggio di errore specificato.

  1. #error messaggio_di_errore

#pragma

La direttiva #pragma serve per inviare particolari istruzioni al compilatore

Macro Predefinite

Macro Predefinite
Operatore Descrizione
__LINE__ Rappresenta il numero di linea corrente
__FILE__ Indica il nome del file sorgente
__DATE__ Rappresenta la data corrente di quando è iniziata la compilazione
__TIME__ Rappresenta l'ora corrente di quando è iniziata la compilazione
__STDC__ La costante decimale 1. è usato per verificare se questo è il compilatore C standard.


 
Guida Linguaggio C