La dichiarazione è semplicemente una breve istruzione che dichiara che la funzione esiste e che aspetto ha l'interfaccia. Considerare una funzione di base add
che aggiunge due numeri interi insieme. La sua dichiarazione potrebbe essere simile al seguente:
int add(int, int);
Questo significa che "esiste una funzione add
che prende due interi e restituisce un intero". Non specifica cosa effettivamente fa la funzione, nonostante il fatto che possiamo fare una buona congettura basata sul suo nome.
La definizione della funzione è dove definiamo esattamente cosa fa la funzione . Questo potrebbe essere ciò che consideri il codice funzione effettivo. Utilizzando la funzione add
come esempio:
int add (int a, int b)
{
return a + b;
}
Così come questo in forma con la tua domanda? Bene, supponiamo di avere un certo numero di funzioni matematiche in math.cpp
:
// math.cpp
int add (int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
E supponiamo anche decidiamo di utilizzare alcuni di questi nella nostra funzione principale in main.cpp
:
// main.cpp
#include <iostream>
int main (int argc, char* argv[])
{
std::cout << "1 + 2 = " << add(1, 2) << std::endl;
std::cout << "8 - 3 = " << sub(8, 3) << std::endl;
}
Se si tenta di compilare main.cpp
così com'è, si lamenterà che non sa cosa sono add
e sub
.Questo perché stai cercando di usarli senza dichiarare che esistono, il che è esattamente ciò per cui è una dichiarazione. Quindi potresti fare quanto segue:
// main.cpp
#include <iostream>
int add(int, int);
int sub(int, int);
int main (int argc, char* argv[])
{
std::cout << "1 + 2 = " << add(1, 2) << std::endl;
std::cout << "8 - 3 = " << sub(8, 3) << std::endl;
}
Questo funzionerebbe, ma non è molto flessibile. Se aggiungiamo una nuova funzione mul
, dobbiamo andare e aggiungere la sua dichiarazione a main.cpp
e ogni altro file .cpp
che lo utilizza (che è molto lavoro se si hanno molti file .cpp
). Quindi ciò che facciamo è invece mettere tutte le dichiarazioni in un singolo file (ad esempio, math.h
), quindi dobbiamo solo mantenere l'elenco delle dichiarazioni in un singolo punto. Quindi, includiamo semplicemente math.h
in qualsiasi file che utilizza le funzioni matematiche. Questo è lo scopo dei file header (a.k.a. include files).
Questo funziona benissimo, ma potrebbe essere anche meglio. Così com'è, abbiamo un file main.cpp
e un file math.cpp
, entrambi compilati ogni volta che si compila il programma *. Se le tue funzioni matematiche non cambiano affatto, sicuramente è meglio compilarle una volta e basta inserire le definizioni precompilate nel tuo eseguibile ogni volta che ricomponi main.cpp
? Questo è esattamente lo scopo dei file .lib
. Contengono il codice precompilato per le definizioni delle funzioni pertinenti. Hai ancora bisogno del file include per farti sapere quali funzioni esistono nella lib.
Lo scopo della fase di collegamento della compilazione è di prendere queste funzioni precompilate e le funzioni appena compilate e riunirle in un unico file eseguibile. In pratica, puoi vedere una lib statica come codice precompilato per un numero di funzioni predefinite, e la sua corrispondenza include il file come strumento per consentire a qualsiasi codice che vuole usare quelle funzioni di sapere quali sono disponibili e quali sono le loro la descrizione è.
* Questo non è strettamente vero, ma è sufficiente per i nostri scopi qui.
Conoscete la differenza tra la compilazione e il collegamento? Questo potrebbe aiutare a chiarire la risposta. – sstn