I namespace in C++ e i prefissi dei nomi in C
In questa lezione vedrai come evitare nomi di funzione duplicati nei programmi grandi con i namespace del C++ e la convenzione dei prefissi in C.
Introduzione
Nei programmi grandi, o quando si usano molte librerie, capita facilmente che due funzioni abbiano lo stesso nome. C++ risolve il problema con i namespace, spazi separati per i nomi. C non ha i namespace, quindi le librerie in C di solito aggiungono un prefisso (prefix) ai nomi, come math_square.
Punti importanti
- Capisci come si fa in C prima di imparare le astrazioni del C++.
- Usa RAII e la semantica di valore (value semantics) per esprimere il possesso delle risorse.
- Preferisci gli strumenti del C++ con sicurezza dei tipi a macro e conversioni di tipo.
Esempi di codice C e C++
#include <stdio.h>
int math_square(int value) {
return value * value;
}
int main(void) {
printf("%d\n", math_square(7));
}
49
#include <iostream>
namespace math {
int square(int value) {
return value * value;
}
}
int main() {
std::cout << math::square(7) << '\n';
}
49
Confronto tra C e C++
In C, il prefisso math_ è solo una convenzione di nomi e dipende interamente dall'attenzione del programmatore. In C++, la funzione square sta nel namespace math e si chiama con il nome completo math::square. Il compilatore garantisce che i nomi in namespace diversi non entrino in conflitto e permette di dare alias ai namespace con nomi lunghi.
C usa convenzioni sui nomi, callback, macro e struct con il contesto.
C++ offre astrazioni con un ambito chiaro, sicure rispetto ai tipi e che di solito non costano nulla in più in esecuzione.
Esercizi di approfondimento
Esegui entrambe le versioni e poi modifica il codice per osservare la differenza di sicurezza che offre ciascun linguaggio.
- Scrivi prima il meccanismo in C e solo dopo usa la funzionalità equivalente del C++.
- Sostituisci la liberazione manuale delle risorse con RAII.
- Controlla se la funzionalità causa allocazioni di memoria o chiamate a funzioni virtuali.