C/Compilatore e precompilatore/Direttive: differenze tra le versioni
salvo prima che perdo tutto :-P |
salvo |
||
Riga 46: | Riga 46: | ||
#define NUM 10 |
#define NUM 10 |
||
#define EXPR(a) (a)==6 ? 6 : 0 |
#define EXPR(a) (a)==6 ? 6 : 0 |
||
#ifdef NUM |
|||
#if NUM==10 |
#if NUM==10 |
||
printf("NUM è uguale a 10.\n"); |
printf("NUM è uguale a 10.\n"); |
||
Riga 57: | Riga 58: | ||
printf("NUM è minore di 10: %d\n", NUM); |
printf("NUM è minore di 10: %d\n", NUM); |
||
#else |
#else |
||
printf("NUM è maggiore di 10 |
printf("NUM è maggiore di 10: %d\n", NUM); |
||
#endif |
|||
#else |
|||
printf("NUM non è definito.\n", NUM); |
|||
#endif |
#endif |
||
return 0; |
return 0; |
||
Riga 64: | Riga 68: | ||
==={{IndexItem|#include}}<tt>#include</tt>=== |
==={{IndexItem|#include}}<tt>#include</tt>=== |
||
La direttiva <tt>#include</tt> è molto importante: permette di includere un file C in un altro. La sua sintassi è la seguente: |
|||
#include <file.h> |
|||
#include "file.h" |
|||
Qual è la differenza fra parentesi angolari e virgolette? Dipende dal compilatore, ma solitamente con le parentesi angolari il {{IndexItem|linker}}linker cerca nelle directory della libreria standard, mentre con le virgolette si cerca il file prima all'interno della directory corrente e poi all'interno delle directory della libreria standard. |
|||
==={{IndexItem|#line}}<tt>#line</tt>=== |
==={{IndexItem|#line}}<tt>#line</tt>=== |
||
La direttiva <tt>#line</tt> permette di alterare il contenuto delle [[#Macro|macro]] [[#__LINE__|__LINE__]] e [[#__FILE__|__FILE__]]. |
|||
La sintassi è: |
|||
#line numerolinea "nomefile" |
|||
Esempio: |
|||
<pre> |
|||
#include <stdio.h> |
|||
#include <stdlib.h> |
|||
#line 70 "prova.c" |
|||
int main(void) //linea 71 |
|||
{ //Linea 72 |
|||
printf("Linea: %d; File: %s\n", __LINE__, __FILE__); //Linea 73 |
|||
} |
|||
</pre> |
|||
Il file è opzionale. |
|||
==={{IndexItem|#pragma}}<tt>#pragma</tt>=== |
==={{IndexItem|#pragma}}<tt>#pragma</tt>=== |
||
La direttiva <tt>#pragma</tt> serve per inviare particolari istruzioni al compilatore. Le opzioni disponibili variano da compilatore a compilatore, per cui è consigliabile consultarne la documentazione. |
|||
==={{IndexItem|#undef}}<tt>#undef</tt>=== |
==={{IndexItem|#undef}}<tt>#undef</tt>=== |
||
La direttiva <tt>#undef</tt> serve per cancellare delle macro definite in precedenza con <tt>#define</tt>. Sintassi: |
|||
#undef macro |
|||
Esempio: |
|||
<pre> |
|||
#include <stdio.h> |
|||
#include <stdlib.h> |
|||
int main(void) |
|||
{ |
|||
#define NUM 10 |
|||
printf("NUM: %d\n", NUM); |
|||
#undef NUM |
|||
} |
|||
</pre> |
|||
==Operatori== |
==Operatori== |
Versione delle 16:50, 2 set 2006
LAVORI IN CORSO! - WORK IN PROGRESS! Pietrodn (discussione) si sta occupando di questo testo; non apportare modifiche se l'ultima modifica è recente. |
Il precompilatore può eseguire diverse istruzioni.
Le direttive
Le direttive sono delle istruzioni al precompilatore e dipendono dal compilatore stesso, per cui è consigliabile consultarne la documentazione.
Le direttive non finiscono con il punto e virgola ma con la fin di riga.
Ecco le direttive:
#define
La direttiva #define serve per definire macro. Sintassi:
#define nomemacro testomacro
Il testo può essere una costante o un'espressione, anche parametrizzata:
#include <stdio.h> #include <stdlib.h> int main(void) { #define NUM 10 #define EXPR(a) (a)==6 ? 6 : 0 printf("%d\n", NUM); printf("%d\n", EXPR(7)); return 0; }
Abbiamo trattato l'operatore ? qui.
#if, #else, #elif ed #endif
Queste direttive servono per la compilazione condizionale.
Esempio:
#include <stdio.h> #include <stdlib.h> int main(void) { #define NUM 10 #define EXPR(a) (a)==6 ? 6 : 0 #ifdef NUM #if NUM==10 printf("NUM è uguale a 10.\n"); #if EXPR(6) printf("EXPR ha dato un risultato! %d\n", EXPR(6)); #else printf("EXPR non ha dato alcun risultato!\n"); #endif #elif NUM<10 printf("NUM è minore di 10: %d\n", NUM); #else printf("NUM è maggiore di 10: %d\n", NUM); #endif #else printf("NUM non è definito.\n", NUM); #endif return 0; }
#include
La direttiva #include è molto importante: permette di includere un file C in un altro. La sua sintassi è la seguente:
#include <file.h> #include "file.h"
Qual è la differenza fra parentesi angolari e virgolette? Dipende dal compilatore, ma solitamente con le parentesi angolari il linker cerca nelle directory della libreria standard, mentre con le virgolette si cerca il file prima all'interno della directory corrente e poi all'interno delle directory della libreria standard.
#line
La direttiva #line permette di alterare il contenuto delle macro __LINE__ e __FILE__.
La sintassi è:
#line numerolinea "nomefile"
Esempio:
#include <stdio.h> #include <stdlib.h> #line 70 "prova.c" int main(void) //linea 71 { //Linea 72 printf("Linea: %d; File: %s\n", __LINE__, __FILE__); //Linea 73 }
Il file è opzionale.
#pragma
La direttiva #pragma serve per inviare particolari istruzioni al compilatore. Le opzioni disponibili variano da compilatore a compilatore, per cui è consigliabile consultarne la documentazione.
#undef
La direttiva #undef serve per cancellare delle macro definite in precedenza con #define. Sintassi:
#undef macro
Esempio:
#include <stdio.h> #include <stdlib.h> int main(void) { #define NUM 10 printf("NUM: %d\n", NUM); #undef NUM }
Operatori
Il preprocessore accetta anche degli speciali operatori:
L'operatore #
L'operatore ##
L'operatore defined
Le macro
Il linguaggio C definisce anche delle macro: