English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial di base del linguaggio C

Controllo di flusso del linguaggio C

C语言的函数

C语言的数组

C语言的指针

C语言的字符串

Struttura del linguaggio C

File del linguaggio C

Altri C

Manuale di riferimento del linguaggio C

C语言的预处理器

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:

IstruzioneDescrizione
#defineDefinire un macro
#includeIncludere un file di codice sorgente
#undefAnnullare il macro definito
#ifdefRestituisce vero se il macro è già definito
#ifndefRestituisce vero se il macro non è definito
#ifSe la condizione fornita è vera, quindi compilare il codice seguente
#elseSostituto di #if
#elifSe la condizione fornita dal #if non è vera, la condizione corrente è vera, quindi compilare il codice seguente
#endifChiudere un blocco di compilazione condizionale #if……#else
#errorQuando si incontra un errore standard, visualizzare un messaggio di errore
#pragmaUtilizzare un metodo standardizzato per pubblicare comandi speciali al compilatore

Esempio di preprocessor

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.

Macro predefinite

ANSI C definisce molte macro. Puoi usarle nel programming, ma non puoi modificare direttamente queste macro predefinite.

MacroDescrizione
__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

Operatore del preprocessore

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!

Macro parametrizzate

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