0Pricing
C Academy · Lezione

Progetti su più file

Header e unità di traduzione

Progetti su più file è 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.

Perché dividere i file

I programmi reali non vivono in un unico file .c. Dividere il codice in più file:

  • Raggruppa le funzioni correlate
  • Permette al compilatore di ricompilare solo ciò che è cambiato
  • Rende il codice riutilizzabile tra più progetti
  • Permette al team di lavorare senza conflitti continui

Capire come vengono collegati i vari elementi è essenziale.

Unità di traduzione

Ogni file .c, dopo che il preprocessore ha espanso le sue inclusioni #include, diventa un'unità di traduzione.

Il compilatore trasforma ogni unità di traduzione indipendentemente in un file oggetto (.o). In questa fase non conosce gli altri file.

Dichiarazione e definizione

Una dichiarazione comunica al compilatore che una funzione esiste e ne specifica la firma. Una definizione fornisce il corpo effettivo.

Agli altri file basta la dichiarazione per chiamare una funzione. La definizione risiede in un unico punto.

int add(int a, int b);          /* declaration: a promise */

int add(int a, int b) {         /* definition: the body */
    return a + b;
}

Il file header

Le dichiarazioni vengono inserite in un header (.h). Qualsiasi file che vuole usare la funzione include l'header.

L'header è l'interfaccia pubblica; il file .c corrispondente è l'implementazione privata.

/* math_utils.h */
#ifndef MATH_UTILS_H
#define MATH_UTILS_H

int add(int a, int b);
int mul(int a, int b);

#endif

Il file di implementazione

Il file .c include il proprio header e definisce le funzioni.

Includere il proprio header permette al compilatore di verificare che le definizioni corrispondano alle dichiarazioni.

/* math_utils.c */
#include "math_utils.h"

int add(int a, int b) { return a + b; }
int mul(int a, int b) { return a * b; }

Usare il modulo

Un altro file include l'header e chiama le funzioni. Non ha mai bisogno di vedere i corpi delle funzioni.

Il compilatore si affida alle dichiarazioni; in seguito il linker collegherà le chiamate alle definizioni effettive.

/* main.c */
#include <stdio.h>
#include "math_utils.h"

int main(void) {
    printf("%d\n", add(2, 3));
    return 0;
}

Compilazione e linking

Due fasi. Prima compili ogni file in un file oggetto con -c. Poi colleghi gli oggetti in un unico eseguibile.

Il linker risolve ogni chiamata a add trovandone la definizione in math_utils.o.

gcc -c main.c          # -> main.o
gcc -c math_utils.c    # -> math_utils.o
gcc main.o math_utils.o -o app

Virgolette e parentesi angolari

La sintassi di inclusione controlla il percorso di ricerca:

  • #include "math_utils.h" cerca prima nella directory del progetto
  • #include <stdio.h> cerca solo nei percorsi di inclusione del sistema

Usi le virgolette per i propri header e le parentesi angolari per la libreria standard.

La parola chiave extern

Per condividere una variabile globale tra più file, la definisca una volta in un file .c e la dichiari con extern nell'header.

extern indica che 'questa variabile esiste altrove', evitando definizioni duplicate.

/* in config.h */
extern int g_verbose;   /* declaration */

/* in config.c */
int g_verbose = 0;      /* the single definition */

La parola chiave static

A livello di file, static rende una funzione o una variabile privata della propria unità di traduzione.

Un helper statico non può essere collegato dagli altri file, evitando conflitti tra nomi e nascondendo i dettagli di implementazione. In C è il modo per indicare che un elemento è interno.

/* visible only inside this .c file */
static int helper(int x) {
    return x * 2;
}

La regola della definizione unica

Una funzione non statica o una variabile globale può essere definita esattamente una volta nell'intero programma. La si dichiari in molti file, ma la si definisca in uno solo.

Due definizioni di add producono un errore del linker come multiple definition of 'add'. Per questo i corpi delle funzioni non vengono inseriti negli header.

Verifica rapida

Ragioni su ciò che deve appartenere a un header.

Riepilogo

Ora è possibile strutturare un progetto composto da più file:

  • Ogni .c è un'unità di traduzione compilata indipendentemente in un file .o
  • Gli header contengono le dichiarazioni; un file .c contiene ogni definizione
  • Il linker risolve le chiamate tra i file oggetto
  • extern condivide le variabili globali; static mantiene privati i simboli locali al file

Prossimo argomento: automatizzare la compilazione con i Makefile.

Domande Frequenti

La lezione «Progetti su più file» è gratuita?

Sì — il testo completo di «Progetti su più file» è 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 «Progetti su più file»?

Header e unità di traduzione 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 «Progetti su più file»?

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

  1. Compilazione condizionale
  2. Progetti su più file
  3. Makefile
  4. Librerie statiche e condivise
← Torna a C Academy