Obiecte externe
Pe lângă funcții, fișierele externe pot conține diverse obiecte – variabile și constante. Pentru a conecta obiecte externe într-un fișier de cod se folosește cuvântul cheie extern.
De exemplu, să presupunem că avem fișierul objects.cpp, în care sunt definite:
#include <string>
std::string message {"Hello"};
unsigned times {3};
Aici sunt definite variabile de tip std::string și unsigned int. Pentru a folosi tipul std::string este necesară includerea fișierului de antet <string>.
Să presupunem că fișierul principal al programului se numește app.cpp și folosește aceste variabile:
#include <iostream>
extern std::string message;
extern unsigned times;
int main()
{
for(unsigned i{}; i < times; i++)
{
std::cout << message << std::endl;
}
}
Pentru a folosi variabilele definite într-un fișier extern, acestea sunt declarate folosind cuvântul cheie extern:
extern std::string message;
extern unsigned times;
În funcția main, în cadrul unui ciclu, afișăm de times ori șirul message în consolă.
La compilarea cu g++, trebuie transmise toate fișierele separate prin spațiu compilatorului:
g++ app.cpp objects.cpp -o app
Aici se presupune că fișierele app.cpp și objects.cpp se află în același dosar. Același lucru este valabil și pentru compilarea cu Clang:
clang++ app.cpp objects.cpp -o app.exe
La ieșire va fi generat un singur fișier app. Iar rezultatul afișat în consolă va fi:
Hello
Hello
Hello
Conectarea constantelor
Conectarea constantelor are o particularitate – cuvântul cheie extern trebuie indicat și la definirea constantei. Astfel, modificăm fișierul objects.cpp astfel:
#include <string>
extern const std::string message {"Hello"}; // constanta
unsigned times {3};
Modificăm de asemenea fișierul app.cpp:
#include <iostream>
extern const std::string message; // conectăm constanta
extern unsigned times;
int main()
{
for(unsigned i{}; i < times; i++)
{
std::cout << message << std::endl;
}
}
Rezultatul va fi același ca în cazul precedent.
Mutarea declarațiilor într-un fișier de antet
În exemplul de mai sus, suntem nevoiți să conectăm în fișierul principal al programului două obiecte externe. Dar ce facem dacă avem multe astfel de variabile și constante? Pentru a nu aglomera fișierul principal, putem – așa cum am procedat și cu funcțiile externe – să mutăm declarațiile obiectelor externe într-un fișier de antet separat. Astfel, definim în același dosar în care se află fișierele app.cpp și objects.cpp, un nou fișier – objects.h:
extern const std::string message; // conectăm constanta
extern unsigned times;
Acum conectăm acest fișier de antet în fișierul app.cpp:
#include <iostream>
#include "objects.h" // conectăm obiectele externe
int main()
{
for(unsigned i{}; i < times; i++)
{
std::cout << message << std::endl;
}
}