Guardie di inclusione
Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 2 di 61.
Quando un file header viene incluso più volte in un progetto, il compilatore vede ripetutamente le stesse dichiarazioni, causando errori. Questo accade comunemente quando più file includono lo stesso header o quando gli header si includono a vicenda. Le protezioni contro le inclusioni multiple risolvono questo problema.
Una guardia di inclusione usa tre direttive del preprocessore per assicurarsi che il contenuto di un header venga elaborato una sola volta:
// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
int add(int a, int b);
#endif
Ecco come funziona: #ifndef MATH_UTILS_H verifica se il simbolo MATH_UTILS_H non è stato ancora definito. Se non lo è, il preprocessore continua e lo definisce immediatamente con #define MATH_UTILS_H. Tutto ciò che si trova tra questo punto e #endif viene incluso nella compilazione.
La seconda volta che questo header viene incluso, MATH_UTILS_H è già definito, quindi l’intero blocco viene saltato. Il nome della guardia è in genere il nome del file in maiuscolo, con i punti e i caratteri speciali sostituiti da trattini bassi.
Ogni file header che crei dovrebbe avere delle guardie di inclusione. È una pratica standard che previene gli errori di compilazione e rende il tuo codice sicuro da includere ovunque nel tuo progetto.
Sfida
FacileProteggiamo un file di intestazione dalle inclusioni doppie aggiungendo delle guardie di inclusione. Partirai dall'utilità di saluto della lezione precedente, ma questa volta assicurati che l'intestazione possa essere inclusa più volte senza problemi.
Creerai due file:
greet.h: il tuo file di intestazione contenente la dichiarazione della funzionegreet. Questa volta, racchiudi l'intero contenuto tra guardie di inclusione usando il simboloGREET_H.main.c: il tuo file principale, che include l'intestazione, implementa la funzionegreete la richiama damain().
La funzione greet deve accettare un parametro const char* per il nome e stampare:
Hello, Alice!Il tuo file di intestazione deve seguire questa struttura:
#ifndef GREET_H
#define GREET_H
// function declaration here
#endifRiceverai un input: un nome (stringa).
Stampa il messaggio di saluto esattamente come mostrato nel formato qui sopra, sostituendo Alice con il nome fornito.
Provalo tu
#include <stdio.h>
#include "greet.h"
// TODO: Implementa la función greet que imprime "Hello, <name>!"
int main() {
char name[100];
scanf("%s", name);
// TODO: Llama a la función greet con el nombre
return 0;
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Basi di programmazione modulare
File di intestazioneGuardie di inclusioneFile sorgenteFunzioni staticheRipasso: calcolatrice modulare4Incapsulamento
Il concetto di puntatori opachiDefinire struct opacheGetter e setterLa convalida nei setterRiepilogo: scatola segreta2Oggetti e metodi
Le struct come oggettiIl puntatore 'Self'Correttezza constPuntatore o valoreMetodi di supportoRiepilogo: gestore di punti5Progetto: Conto bancario semplice
Configurazione del progettoImplementazione del conto8Polimorfismo
Puntatori a funzione nelle structSimulare i metodiIl concetto di interfacciaImplementare le interfacceIterazione polimorficaRiepilogo: Greeter11Pattern di progettazione in C
Pattern SingletonPattern FactoryPattern IteratorRiepilogo: Factory di Logger3Ciclo di vita degli oggetti
Pattern del costruttorePattern del distruttoreInizializzazione sullo stackCopia profondaRiepilogo: wrapper di stringhe6Ereditarietà tramite composizione
Incorporamento delle structLa regola del primo membroAccesso ai membri della classe baseUpcastingRiepilogo: gerarchia di forme9Progetto: Disegnatore di forme
Panoramica del progettoImplementazione del cerchioImplementazione del rettangoloUtilizzo polimorficoContenitore di formeEsercitati da solo: Compilatore C online