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 includono l’uno l’altro. Le protezioni contro le inclusioni risolvono questo problema.
Una guardia di inclusione usa tre direttive del preprocessore per garantire che il contenuto di un file 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 controlla se il simbolo MATH_UTILS_H non è ancora stato 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 protezioni per l'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 header dalle inclusioni multiple aggiungendo delle guardie di inclusione. Partirai dall'utility di saluto della lezione precedente, ma questa volta ti assicurerai che l'header possa essere incluso più volte in sicurezza.
Creerai due file:
greet.h: il tuo file header 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'header, implementa la funzionegreete la chiama damain().
La funzione greet deve accettare un parametro const char* per il nome e stampare:
Hello, Alice!Il tuo file header 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 sopra, sostituendo Alice con il nome fornito.
Provalo tu
#include <stdio.h>
#include "greet.h"
// TODO: Implementa la funzione greet che stampa "Hello, <name>!"
int main() {
char name[100];
scanf("%s", name);
// TODO: Chiama la funzione greet passando il nome
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