English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In questo tutorial, ti introdurremo al preprocessor C e impareremo a utilizzare #include, #define e la compilazione condizionale con l'aiuto di esempi. Il preprocessor C è un preprocessor macro (che ti permette di definire macro), che può essere trasformato prima della compilazione del programma. Queste trasformazioni possono includere file di header, espansione dei macro, ecc. Tutte le istruzioni di preprocessamento iniziano con il simbolo #.
Preprocessor CNon fa parte del compilatore, ma è una parte separata del processo di compilazione. In breve, il preprocessor C non è altro che uno strumento di sostituzione del testo, che indica al compilatore di completare le operazioni di preprocessamento necessarie prima della compilazione effettiva. Abbiamo abbreviato il preprocessor C come CPP.
Tutte le istruzioni del preprocessor iniziano con il simbolo (#). Deve essere il primo carattere non vuoto, per migliorare la leggibilità, le istruzioni del preprocessor dovrebbero iniziare dalla prima colonna. Di seguito è riportato un elenco di tutte le istruzioni preprocessor importanti:
Istruzione | Descrizione |
---|---|
#define | Definire un macro |
#include | Includere un file di codice sorgente |
#undef | Annullare il macro definito |
#ifdef | Restituisce vero se il macro è già definito |
#ifndef | Restituisce vero se il macro non è definito |
#if | Se la condizione fornita è vera, quindi compilare il codice seguente |
#else | Sostituto di #if |
#elif | Se la condizione fornita dal #if non è vera, la condizione corrente è vera, quindi compilare il codice seguente |
#endif | Chiudere un blocco di compilazione condizionale #if……#else |
#error | Quando si incontra un errore standard, visualizzare un messaggio di errore |
#pragma | Utilizzare un metodo standardizzato per pubblicare comandi speciali al compilatore |
Analizzare l'esempio seguente per comprendere diverse istruzioni.
#define MAX_ARRAY_LENGTH 20
Questa istruzione informa il CPP di sostituire tutti i MAX_ARRAY_LENGTH con 20. Utilizzare #define Definire costanti per migliorare la leggibilità.
#include <stdio.h> #include "myheader.h"
Queste istruzioni informano il CPP di ottenerelibreria di sistemaottiene stdio.h e aggiunge il testo al file sorgente corrente. La riga successiva informa il CPP di ottenere myheader.h,e aggiunge il contenuto al file sorgente corrente.
#undef FILE_SIZE #define FILE_SIZE 42
Questa istruzione informa il CPP di annullare la definizione di FILE_SIZE e definirla come 42.
#ifndef MESSAGE #define MESSAGE "You wish!" #endif
Questa istruzione informa il CPP di definire MESSAGE solo se MESSAGE non è definito.
#ifdef DEBUG /* Le tue istruzioni di debug qui */ #endif
Questa istruzione informa il CPP di eseguire le istruzioni di elaborazione se è definito DEBUG durante la compilazione. Durante la compilazione, se invii -DDEBUG Switch, questa istruzione è molto utile. Definisce DEBUG, che puoi abilitare o disabilitare durante la compilazione.
ANSI C definisce molte macro. Puoi usarle nel programming, ma non puoi modificare direttamente queste macro predefinite.
Macro | Descrizione |
---|---|
__DATE__ | La data corrente, una costante di carattere rappresentata nel formato "MMM DD YYYY". |
__TIME__ | L'ora corrente, una costante di carattere rappresentata nel formato "HH:MM:SS". |
__FILE__ | Questo contiene il nome del file corrente, una costante di stringa. |
__LINE__ | Questo contiene il numero di riga corrente, una costante decimale. |
__STDC__ | Quando il compilatore compila con lo standard ANSI, viene definito come 1. |
Proviamo a fare un esempio di seguito:
#include <stdio.h> main() { printf("File : %s\n", __FILE__); printf("Date : %s\n", __DATE__); printf("Time : %s\n", __TIME__); printf("Line : %d\n", __LINE__); printf("ANSI : %d\n", __STDC__); }
Quando il codice sopra (nel file test.c Quando viene compilato e eseguito, produrrà i seguenti risultati:
File : test.c Date : Jun 2 2012 Time : 03:36:24 Line : 8 ANSI : 1
Il preprocessore C fornisce i seguenti operatori per aiutarti a creare macro:
Operatore di continuazione di macro (\)
Una macro di solito è scritta su una singola riga. Tuttavia, se la macro è troppo lunga per essere contenuta in una singola riga, si utilizza l'operatore di continuazione di macro (\). Ad esempio:
#define message_for(a, b) \ printf(#a " and " #b ": We love you!\n")
Operatore di quantizzazione delle stringhe (#)
Nella definizione di macro, quando si ha bisogno di convertire un parametro di macro in una costante di stringa, si utilizza l'operatore di costantizzazione di stringa (#). L'operatore utilizzato nella macro ha un parametro specifico o una lista di parametri. Ad esempio:
#include <stdio.h> #define message_for(a, b) \ printf(#a " and " #b ": We love you!\n") int main(void) { message_for(Carole, Debra); return 0; }
当上面的代码被编译和执行时,它会产生以下结果:
Carole and Debra: We love you!
Operatore di incollaggio dei token (##)
L'operatore di incollaggio dei token (##) all'interno della definizione della macro combina due parametri. Permette di combinare due token indipendenti in un singolo token all'interno della definizione della macro. Ad esempio:
#include <stdio.h> #define tokenpaster(n) printf("token" #n " = %d", token##n) int main(void) { int token34 = 40; tokenpaster(34); return 0; }
当上面的代码被编译和执行时,它会产生以下结果:
token34 = 40
Come è successo, perché questo esempio produce l'output effettivo del compilatore elencato di seguito:
printf("token34 = %d", token34);
Questo esempio dimostra come token##n si connette a token34, dove abbiamo utilizzatoOperatore di quantizzazione delle stringhe (#)eOperatore di incollaggio dei token (##).
Operatore defined()
Preprocessor defined Gli operatori sono usati negli espressioni costanti per determinare se un identificatore è stato definito con #define. Se l'identificatore specificato è definito, il valore è vero (non zero). Se l'identificatore specificato non è definito, il valore è falso (zero). Esempio di utilizzo dell'operatore defined():
#include <stdio.h> #if !defined(MESSAGE) #define MESSAGE "You wish!" #endif int main(void) { printf("Questo è il messaggio: %s\n", MESSAGE); return 0; }
当上面的代码被编译和执行时,它会产生以下结果:
Questo è il messaggio: You wish!
Una delle funzioni potenti del CPP è quella di utilizzare macro parametrizzate per simulare funzioni. Ad esempio, il seguente codice calcola il quadrato di un numero:
int square(int x) { return x * x; }
Possiamo riscrivere il codice sopra utilizzando la macro, come segue:
#define square(x) ((x) * (x))
Prima di utilizzare una macro con parametri, è necessario utilizzare #define Definizione di istruzione. La lista dei parametri è racchiusa tra parentesi tonde e deve essere immediatamente seguita dal nome della macro. Non è permesso uno spazio tra il nome della macro e la parentesi aperta. Ad esempio:
#include <stdio.h> #define MAX(x,y) ((x) > (y) ? (x) : (y)) int main(void) { printf("10到20之间的最大值是%d\n", MAX(10, 20)); return 0; }
当上面的代码被编译和执行时,它会产生以下结果:
10到20之间的最大值是20