Guardie di inclusione
Prevenga le inclusioni multiple.
Guardie di inclusione è una lezione C Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C Academy include 4 lezioni in totale.
Il problema della doppia inclusione
Gli header includono spesso altri header. È facile che un header finisca incluso due volte nello stesso file sorgente.
Quando accade, ogni dichiarazione al suo interno compare due volte. Per le definizioni di tipo come struct o typedef, questo causa un errore di compilazione: un tipo non può essere definito più di una volta.
Come si verifica
Supponiamo che a.h e b.h includano entrambi types.h. Un file sorgente che li include entrambi si ritrova con types.h incollato due volte.
Il preprocessore copia ciecamente il testo degli header, quindi le definizioni di types.h vengono duplicate e provocano un errore di ridefinizione.
/* a.h */ #include "types.h"
/* b.h */ #include "types.h"
/* main.c */
#include "a.h"
#include "b.h" /* types.h now seen twice */La protezione dagli include
Una protezione dagli include è un piccolo accorgimento del preprocessore che rende sicuro includere un header molte volte.
Racchiude l'intero header in una condizione, così il corpo viene elaborato solo la prima volta. Le inclusioni successive vengono completamente ignorate.
#ifndef TYPES_H
#define TYPES_H
/* header contents here */
#endif /* TYPES_H */Come funziona la protezione
La prima volta che l'header viene incontrato, TYPES_H non è definito, quindi #ifndef è vero e il corpo viene elaborato. In seguito #define imposta la macro.
In ogni inclusione successiva, TYPES_H esiste già, quindi #ifndef è falso e il preprocessore passa direttamente a #endif.
#ifndef TYPES_H /* true only the first time */
#define TYPES_H /* remember we've been here */
/* ... body ... */
#endifUn header completo con protezione
Ecco un header realistico con una protezione che tutela una definizione di tipo.
Anche se molti file includono point.h direttamente o indirettamente, la struct Point viene definita esattamente una volta per ogni unità di traduzione.
/* point.h */
#ifndef POINT_H
#define POINT_H
typedef struct {
int x;
int y;
} Point;
Point point_add(Point a, Point b);
#endifScegliere il nome della macro
La macro di protezione deve essere unica nell'intero progetto, altrimenti due header potrebbero entrare in conflitto e nascondersi a vicenda senza segnalazioni.
Una convenzione comune ricava il nome dal nome del file, in maiuscolo: point.h diventa POINT_H, net/socket.h diventa NET_SOCKET_H.
#ifndef NET_SOCKET_H
#define NET_SOCKET_H
/* ... */
#endifEvitare i nomi riservati
Gli identificatori che iniziano con un underscore seguito da una lettera maiuscola, oppure contengono due underscore consecutivi, sono riservati al compilatore e alla libreria standard.
Eviti protezioni come __POINT_H__. Una forma semplice con underscore finale, come POINT_H, è sicura e chiara.
#ifndef _POINT_H_ /* risky: reserved name pattern */
#ifndef POINT_H /* preferred */L'alternativa #pragma once
La maggior parte dei compilatori moderni supporta #pragma once, una singola riga all'inizio di un header che svolge lo stesso compito.
È più breve ed evita i conflitti tra nomi, ma non fa parte dello standard C. Le protezioni tradizionali con #ifndef funzionano ovunque.
/* point.h */
#pragma once
typedef struct { int x; int y; } Point;Protezioni e pragma a confronto
Le protezioni con #ifndef sono completamente portabili e standard, ma richiedono una macro unica per ogni header.
#pragma once è compatto e non presenta conflitti tra nomi, ma dipende dal supporto del compilatore. Alcuni progetti usano entrambi: un pragma insieme a una protezione classica per la massima sicurezza.
#pragma once
#ifndef POINT_H
#define POINT_H
/* ... */
#endifLe protezioni valgono per unità di traduzione
Una protezione dagli include impedisce l'inclusione duplicata all'interno di un singolo file sorgente durante la compilazione.
Non impedisce che un header venga elaborato una volta in ciascun file .c separato. Ed è corretto così, perché ogni file sorgente è un'unità di traduzione distinta.
Lo trasformi in un'abitudine
Aggiunga una protezione dagli include a ogni header che scrive, fin dalla prima riga. Richiede tre righe e previene un'intera categoria di errori difficili da comprendere.
Anche gli header semplici possono in seguito essere inclusi indirettamente tramite altri header, quindi proteggerli fin dall'inizio evita problemi.
/* config.h */
#ifndef CONFIG_H
#define CONFIG_H
#define MAX_USERS 100
#endifVerifica rapida
Verifichi la Sua comprensione delle protezioni dagli include.
Riepilogo
Ha imparato perché includere due volte un header causa errori di ridefinizione e come una protezione dagli include li previene.
Usi #ifndef/#define/#endif con una macro unica, oppure #pragma once. Ora vedremo come condividere variabili tra file con extern.
Domande Frequenti
La lezione «Guardie di inclusione» è gratuita?
Sì — il testo completo di «Guardie di inclusione» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C Academy, passa a CoddyKit PRO. Il corso C Academy include 4 lezioni in totale.
Cosa imparerò in «Guardie di inclusione»?
Prevenga le inclusioni multiple. Eserciti C Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare C Academy?
Non è richiesta alcuna esperienza precedente. C Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Guardie di inclusione»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione C Academy?
Sì. Ogni lezione C Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- File header e sorgente
- Guardie di inclusione
- extern e linkage
- Compilare più file