C++ moderno e alternative C

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++

C
Esegui →
main.c
#include <stdio.h>

int math_square(int value) {
    return value * value;
}

int main(void) {
    printf("%d\n", math_square(7));
}
Risultato dell'esecuzione
49
C++
Esegui →
main.cpp
#include <iostream>

namespace math {
    int square(int value) {
        return value * value;
    }
}

int main() {
    std::cout << math::square(7) << '\n';
}
Risultato dell'esecuzione
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

C usa convenzioni sui nomi, callback, macro e struct con il contesto.

C++

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.