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

Wikibooks, manuali e libri di testo liberi.
Contenuto cancellato Contenuto aggiunto
Pietrodn (discussione | contributi)
Nessun oggetto della modifica
Pietrodn (discussione | contributi)
Nessun oggetto della modifica
Riga 10: Riga 10:
Ecco le direttive:
Ecco le direttive:


==={{IndexItem|#define}}<tt>#define</tt>===
==={{IndexItem|direttive #define}}<tt>#define</tt>===
La direttiva <tt>#define</tt> serve per definire {{IndexItem|macro}}macro. Sintassi:
La direttiva <tt>#define</tt> serve per definire {{IndexItem|macro}}macro. Sintassi:
#define nomemacro testomacro
#define nomemacro testomacro
Riga 31: Riga 31:
Abbiamo trattato l'{{IndexItem|operatore ?}}operatore ? [[Linguaggio_C/Blocchi_e_funzioni/Blocchi_if_e_switch#L.27operatore_.3F|qui]].
Abbiamo trattato l'{{IndexItem|operatore ?}}operatore ? [[Linguaggio_C/Blocchi_e_funzioni/Blocchi_if_e_switch#L.27operatore_.3F|qui]].


==={{IndexItem|#if, #else, #elif ed #endif}}<tt>#if, #else, #elif ed #endif</tt>===
==={{IndexItem|direttive #if, #else, #elif ed #endif}}<tt>#if, #else, #elif ed #endif</tt>===


Queste direttive servono per la {{IndexItem|compilazione condizionale}}''compilazione condizionale''.
Queste direttive servono per la {{IndexItem|compilazione condizionale}}''compilazione condizionale''.
Riga 65: Riga 65:
</pre>
</pre>


==={{IndexItem|#include}}<tt>#include</tt>===
==={{IndexItem|direttive #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:
La direttiva <tt>#include</tt> è molto importante: permette di includere un file C in un altro. La sua sintassi è la seguente:


Riga 73: Riga 73:
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.
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|direttive #line}}<tt>#line</tt>===


La direttiva <tt>#line</tt> permette di alterare il contenuto delle [[#Macro|macro]] [[#__LINE__|__LINE__]] e [[#__FILE__|__FILE__]].
La direttiva <tt>#line</tt> permette di alterare il contenuto delle [[#Macro|macro]] [[#__LINE__|__LINE__]] e [[#__FILE__|__FILE__]].
Riga 98: Riga 98:
Il file è opzionale.
Il file è opzionale.


==={{IndexItem|#pragma}}<tt>#pragma</tt>===
==={{IndexItem|direttive #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.
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|direttive #undef}}<tt>#undef</tt>===
La direttiva <tt>#undef</tt> serve per cancellare delle macro definite in precedenza con <tt>#define</tt>. Sintassi:
La direttiva <tt>#undef</tt> serve per cancellare delle macro definite in precedenza con <tt>#define</tt>. Sintassi:


Riga 123: Riga 123:
Il preprocessore accetta anche degli speciali operatori:
Il preprocessore accetta anche degli speciali operatori:


===L'operatore {{IndexItem|# (operatore)}}<tt>#</tt>===
===L'operatore {{IndexItem|operatore #}}<tt>#</tt>===


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


===L'operatore {{IndexItem|## (operatore)}}<tt>##</tt>===
===L'operatore {{IndexItem|operatore ##}}<tt>##</tt>===


Questo operatore si chiama ''operatore di concatenamento''. Esempio:
Questo operatore si chiama ''operatore di concatenamento''. Esempio:
Riga 158: Riga 158:
Questo programma stamperà il numero 10.
Questo programma stamperà il numero 10.


===L'operatore {{IndexItem|defined (operatore)}}<tt>defined</tt>===
===L'operatore {{IndexItem|operatore defined}}<tt>defined</tt>===


==Le macro==
==Le macro==

Versione delle 17:25, 2 set 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.