Il programma
Ecco il programma Hello World completo in C++. Premi Esegui per compilarlo ed eseguirlo nel browser:
Stampa una riga:
Hello, World!
Cinque righe di codice, e ognuna ha un compito preciso. Le sezioni qui sotto le esaminano in ordine, poi spiegano come compilare lo stesso file sul tuo computer e cosa significano di solito i primi errori del compilatore.
Riga per riga
#include <iostream>
Le righe che iniziano con # sono istruzioni per il preprocessore, che viene eseguito prima del compilatore vero e proprio. #include <iostream> incolla le dichiarazioni dell'header standard <iostream> (stream di input/output). È in quell'header che sono dichiarati std::cout e std::endl. C++ non ha un'istruzione di stampa integrata: la stampa fa parte della libreria standard, e la attivi con questa riga.
int main() {
Ogni programma C++ inizia l'esecuzione da una funzione chiamata main. Ce ne deve essere esattamente una, e va scritta in minuscolo. L'int che la precede dice che main restituisce un intero al sistema operativo quando finisce. Le parentesi vuote indicano che qui non riceve argomenti, e la parentesi graffa di apertura { inizia il corpo della funzione.
std::cout << "Hello, World!" << std::endl;
Questa è la riga che stampa davvero.
std::coutè lo stream di output standard, di solito il terminale. Il prefissostd::indica checoutsi trova nel namespacestd, dove è raccolta tutta la libreria standard.<<è l'operatore di inserimento. Invia il valore alla sua destra nello stream alla sua sinistra. Puoi concatenarlo, e ogni<<aggiunge il pezzo successivo allo stesso output."Hello, World!"è un letterale stringa: testo tra virgolette doppie.std::endltermina la riga.- Il punto e virgola termina l'istruzione. Ogni istruzione in C++ ne ha bisogno.
return 0;
return termina main e restituisce un valore al sistema operativo. Per convenzione 0 significa che il programma è andato a buon fine, e qualsiasi altro numero segnala un errore. Script e strumenti di build leggono questo codice di uscita. Dentro main la riga è facoltativa: se l'esecuzione raggiunge la parentesi graffa di chiusura, C++ si comporta come se avessi scritto return 0;.
La parentesi graffa di chiusura
La parentesi graffa di chiusura termina il corpo di main e, con esso, il programma.
std::endl vs '\n'
Ci sono due modi comuni per terminare una riga, e compaiono entrambi nel codice reale:
Output:
Hello, World!
Hello again!
Line one
Line two
Il risultato visibile è lo stesso. La differenza è che std::endl scrive un ritorno a capo e poi svuota lo stream, spingendo subito sul terminale il testo rimasto nel buffer. '\n' scrive solo il ritorno a capo, e lo stream si svuota secondo i propri tempi (al più tardi quando il programma termina). In un ciclo che stampa migliaia di righe, gli svuotamenti extra di std::endl fanno una differenza misurabile, perciò molti programmatori C++ usano '\n' di default e riservano std::endl ai casi in cui il testo deve comparire subito. L'escape \n funziona anche dentro una stringa, come mostra la terza riga. La pagina su input e output tratta cout e cin più in dettaglio.
La versione con using namespace std;
Molti tutorial scrivono Hello World così:
using namespace std; dice al compilatore di cercare nel namespace std i nomi che non trova altrove, così cout ed endl funzionano senza prefisso. Va bene per programmi piccoli ed esercizi. Nel codice più grande e nei file header di solito si evita, perché porta nello scope centinaia di nomi standard che possono entrare in conflitto con i tuoi (per esempio una tua funzione chiamata count o distance). Scrivere std::cout costa cinque caratteri ed elimina il rischio.
Compilare ed eseguire Hello World sul tuo computer
L'editor del browser compila al posto tuo. Sulla tua macchina fai tu gli stessi due passaggi: compili il file sorgente in un eseguibile, poi esegui l'eseguibile. Prima ti serve un compilatore C++ installato; la guida all'installazione spiega come configurarne uno su Windows, macOS e Linux.
Salva il programma come hello.cpp, apri un terminale nella stessa cartella e compilalo:
g++ hello.cpp -o hello
Se non viene stampato nulla, ha funzionato, e accanto al file sorgente ora c'è un eseguibile chiamato hello (hello.exe su Windows). Eseguilo:
./hello
Su Windows esegui invece hello.exe o semplicemente hello. Su macOS clang++ hello.cpp -o hello funziona allo stesso modo, e lì g++ di solito è Clang con un altro nome.
Conviene aggiungere due opzioni fin dall'inizio: -std=c++17 (o -std=c++20) sceglie lo standard del linguaggio, e -Wall -Wextra attiva avvisi che scovano errori reali:
g++ -std=c++17 -Wall -Wextra hello.cpp -o hello
La pagina sulla compilazione in C++ spiega cosa fanno queste opzioni, cosa significa -o e perché senza di essa ottieni un file chiamato a.out.
I primi errori più comuni
I testi di errore qui sotto sono di GCC (g++). Clang formula i messaggi in modo diverso, ma indica la stessa riga.
Punto e virgola mancante.
hello.cpp:5:5: error: expected ';' before 'return'
Il compilatore si accorge del ; mancante solo quando arriva al token successivo, quindi il numero di riga di solito indica la riga dopo l'errore. Controlla la fine della riga precedente.
Manca #include <iostream>.
error: 'cout' is not a member of 'std'
std::cout è dichiarato in <iostream>. Aggiungi l'include all'inizio del file.
Manca std::.
error: 'cout' was not declared in this scope; did you mean 'std::cout'?
Scrivi std::cout e std::endl, oppure aggiungi using namespace std; dopo l'include.
Main invece di main. C++ distingue tra maiuscole e minuscole. Un programma con int Main() compila, poi fallisce nella fase di linking con undefined reference to 'main', perché il linker non trova la funzione da cui il programma dovrebbe partire.
Compilare con gcc invece di g++. gcc hello.cpp compila il codice C++ ma non collega la libreria standard C++, quindi ottieni una lunga lista di errori undefined reference to std::.... Usa g++ (o clang++) per i file C++.
Virgolette tipografiche. Il codice copiato da un elaboratore di testi o da una pagina web può contenere virgolette tipografiche (“Hello”) invece di quelle dritte ("Hello"). GCC segnala stray '\342' in program. Riscrivi le virgolette nel tuo editor.
Header vecchi e void main. Alcuni tutorial molto vecchi usano #include <iostream.h> o void main(). Nessuno dei due è C++ standard: l'header è <iostream> senza .h, e main deve restituire int. I compilatori moderni li rifiutano entrambi.
Stampare con std::println in C++23
C++23 ha aggiunto un modo più breve per stampare una riga, std::println dall'header <print>:
#include <print>
int main() {
std::println("Hello, World!");
}
Aggiunge il ritorno a capo al posto tuo e supporta i segnaposto {} per i valori. Il supporto è arrivato con GCC 14, Clang 18 con libc++ e le versioni recenti di Visual Studio, e richiede -std=c++23. La maggior parte del codice e dei tutorial esistenti usa ancora std::cout, quindi vale la pena padroneggiarli entrambi.
Domande frequenti
Come si scrive Hello World in C++?
Inizia con #include <iostream>, poi definisci int main() e mettici dentro std::cout << "Hello, World!" << std::endl;, seguito da return 0;. Salva il file come hello.cpp, compilalo con g++ hello.cpp -o hello ed esegui ./hello.
Perché Hello World in C++ ha bisogno di #include <iostream>?
std::cout e std::endl sono dichiarati nell'header <iostream>, non fanno parte del linguaggio in sé. Senza l'include il compilatore non conosce quei nomi e si ferma con un errore come 'cout' is not a member of 'std'.
Qual è la differenza tra std::endl e '\n'?
Entrambi terminano la riga. std::endl in più svuota il buffer di output, costringendo il testo a uscire subito. '\n' scrive solo il ritorno a capo e lascia che lo stream si svuoti quando è pronto, il che è più veloce quando stampi molte righe. Per una sola riga di Hello World non c'è alcuna differenza visibile.
Serve return 0 alla fine di main in C++?
No. main è l'unica funzione in cui C++ ti permette di omettere il return; arrivare alla parentesi graffa di chiusura equivale a return 0;, che comunica al sistema operativo che il programma è andato a buon fine. Molti lo scrivono comunque per rendere esplicito il codice di uscita.