C/Compilatore e precompilatore/Direttive: differenze tra le versioni

Wikibooks, manuali e libri di testo liberi.
Contenuto cancellato Contenuto aggiunto
BimBot (discussione | contributi)
Nessun oggetto della modifica
Riga 182: Riga 182:


[[en:C Programming/Preprocessor]]
[[en:C Programming/Preprocessor]]
[[de:C-Programmierung: Präprozessor]]

Versione delle 16:48, 18 ott 2006

Template:Linguaggio C 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__. Essa non salta ad un altro punto del programma; modifica semplicemente queste macro.

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
 return 0;
}

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
return 0;
}

Operatori

Il preprocessore accetta anche degli speciali operatori:

L'operatore #

Questo operatore serve per trasformare una sequenza di caratteri in stringa all'interno di una macro.

Esempio:

  1. include <stdio.h>
  2. include <stdlib.h>

int main(void) {

  1. define str(s) # s

printf(str(Il C mi piace molto.));

return 0;

}

L'operatore ##

Questo operatore si chiama operatore di concatenamento. Esempio:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
#define cat(x,y) x ## y
	int cd=10;
	printf("%d\n", cat(c,d));
 return 0;
}

Questo programma stamperà il numero 10.

L'operatore defined

Le macro

Il linguaggio C definisce anche delle macro:

__DATE__

La macro __DATE__ contiene la data della compilazione nel formato mese/giorno/anno.

__FILE__

La macro __FILE__ contiene il nome del file correntemente in compilazione. Può essere modificata con la direttiva #line.

__LINE__

La macro __LINE__ contiene il numero della linea correntemente in compilazione. Può essere modificata con la direttiva #line.

__TIME__

La macro __TIME__ contiene l'ora della compilazione nel formato ore:minuti:secondi.

__STDC__

Il contenuto della macro __STDC__ varia da compilatore a compilatore. Solitamente, se essa è definita, il compilatore accetterà soltanto codice C standard.