extern e linkage
Condivida i simboli tra i file.
extern e linkage è una lezione C Academy gratuita su CoddyKit. Questa è la lezione 3 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.
Che cos'è il linkage?
Il linkage descrive se un nome può essere condiviso tra file sorgente diversi.
Un nome con linkage esterno fa riferimento alla stessa entità nell'intero programma. Un nome con linkage interno è privato del proprio file. Comprendere il linkage è fondamentale nei programmi composti da più file.
Condividere una variabile
Supponiamo che due file debbano accedere a un unico contatore globale. Non è possibile definirlo semplicemente in entrambi i file: in questo modo si creano due variabili separate e si verifica un errore di collegamento per simbolo duplicato.
È invece necessario definirlo una sola volta e dichiararlo in tutti gli altri file con extern.
/* config.c */
int g_count = 0; /* the one definition */La parola chiave extern
extern comunica al compilatore che una variabile esiste in un'altra parte del programma, senza allocare memoria per essa in questo punto.
È una dichiarazione pura. In seguito, il linker la risolve associandola all'unica definizione presente in un altro file.
/* other.c */
extern int g_count; /* declared, not defined */
void bump(void) {
g_count++;
}Dichiarazione nell'header
Il modello più ordinato consiste nel mettere la dichiarazione extern in un header e la definizione corrispondente in un solo file sorgente.
Qualsiasi file che includa l'header potrà quindi usare la variabile condivisa.
/* config.h */
#ifndef CONFIG_H
#define CONFIG_H
extern int g_count;
#endifUna definizione, molte dichiarazioni
Questa è la One Definition Rule per le variabili globali: una variabile può essere dichiarata con extern in molti file, ma può essere definita in uno solo.
La singola definizione (senza extern) alloca la memoria. Tutte le dichiarazioni extern si limitano a puntare a essa.
/* config.h */ extern int g_count; /* declaration */
/* config.c */ int g_count = 0; /* definition */Anche le funzioni hanno collegamento esterno
Per impostazione predefinita, anche le funzioni hanno collegamento esterno; per questo un prototipo in un header consente agli altri file di chiamarle.
È possibile scrivere extern prima di un prototipo, ma è ridondante: le funzioni sono esterne, a meno che non si specifichi diversamente.
/* both forms mean the same */
int add(int a, int b);
extern int add(int a, int b);Collegamento interno con static
La parola chiave static a livello di file assegna a un nome un collegamento interno: il nome è visibile solo all'interno del proprio file sorgente.
Lo si utilizzi per funzioni di supporto e variabili globali che devono rimanere private a un modulo. Gli altri file non possono né accedervi né entrare in conflitto con esse.
/* parser.c */
static int line_no = 0; /* private to parser.c */
static void advance(void) { /* private helper */
line_no++;
}extern e static a confronto
Queste due parole chiave si trovano agli estremi opposti del collegamento.
extern richiede un collegamento esterno: il nome viene condiviso tra i file. static a livello di file impone un collegamento interno: il nome rimane privato. Una scelta corretta determina ciò che il modulo espone.
extern int shared_total; /* visible everywhere */
static int local_cache; /* only this file */Un errore comune
Chi è alle prime armi a volte inserisce in un header una definizione semplice come int g_count;.
Poiché l'header viene incluso in diversi file, ciascun file riceve la propria definizione e il linker segnala un simbolo duplicato. Nell'header si dichiari sempre con extern e si definisca una sola volta in un file .c.
/* WRONG in a header included twice */
int g_count; /* multiple definition */
/* RIGHT */
extern int g_count; /* declaration only */Mettere insieme i concetti
Questa struttura a tre file è il modo standard per condividere lo stato.
L'header dichiara, un file sorgente definisce e gli altri utilizzano la variabile dopo aver incluso l'header. Il linker collega tutti i riferimenti alla singola definizione.
/* config.h */ extern int g_count;
/* config.c */ #include "config.h"
int g_count = 0;
/* main.c */ #include "config.h"
/* uses g_count */Nota sull'inizializzazione
Solo la definizione effettiva dovrebbe assegnare un valore iniziale: int g_count = 0;.
Una dichiarazione extern non deve inizializzare la variabile, poiché non alloca memoria. Scrivere extern int g_count = 0; la trasforma in una definizione, vanificando lo scopo di extern.
extern int g_count; /* ok: declaration */
extern int g_count = 0; /* becomes a definition */Verifica rapida
Verifichi la propria comprensione di extern e del collegamento.
Riepilogo
Ha imparato che il collegamento controlla la visibilità tra i file. extern dichiara un nome definito altrove; static a livello di file mantiene privato un nome.
Per condividere variabili globali, utilizzi una definizione accompagnata da dichiarazioni extern. Ora compileremo e collegheremo questi file per creare un programma.
Impara C con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 39
- Lezioni
- 144
Domande Frequenti
La lezione «extern e linkage» è gratuita?
Sì — il testo completo di «extern e linkage» è 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 «extern e linkage»?
Condivida i simboli tra i file. 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 3 di 4.
Quanto tempo richiede la lezione «extern e linkage»?
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