Scrivere un Semplice Programma in C++
Iniziamo il nostro studio del linguaggio C++ partendo dalla scrittura di un semplice programma. In questa lezione vedremo come scrivere un programma che include la funzione main
, come compilare il programma e come eseguirlo.
Scrivere un Semplice Programma
Ogni programma C++ contiene una o più funzioni, una delle quali deve chiamarsi main
. Il sistema operativo esegue un programma C++ chiamando main
.
Ecco una versione semplice di main
che non fa nulla se non restituire un valore al sistema operativo:
int main()
{
return 0;
}
Una definizione di funzione ha quattro elementi: un tipo di ritorno, un nome della funzione, una (possibilmente vuota) lista di parametri racchiusa tra parentesi e un corpo della funzione. Sebbene main
sia speciale in alcuni modi, la definiamo nello stesso modo in cui definiamo qualsiasi altra funzione.
In questo esempio, main
ha una lista di parametri vuota (rappresentata da ()
senza nulla all'interno). Vedremo nelle prossime lezioni cosa sono i parametri e come usarli.
La funzione main
è obbligata ad avere un tipo di ritorno int
, che è un tipo che rappresenta numeri interi. Il tipo int
è un tipo incorporato o tipo primitivo, il che significa che è uno dei tipi definiti dal linguaggio.
L'ultima parte di una definizione di funzione, il corpo della funzione, è un blocco di istruzioni che inizia con una parentesi graffa aperta e termina con una parentesi graffa chiusa:
{
return 0;
}
L'unica istruzione in questo blocco è un return
, che è un'istruzione che termina una funzione. Come avviene qui, un return
può anche inviare un valore al chiamante della funzione. Quando un'istruzione return
include un valore, il valore restituito deve avere un tipo compatibile con il tipo di ritorno della funzione. In questo caso, il tipo di ritorno di main
è int
e il valore restituito è 0
, che è un int
.
Ogni istruzione in C++ termina con un punto e virgola
Nota il punto e virgola alla fine dell'istruzione return. I punti e virgola segnano la fine della maggior parte delle istruzioni in C++. Sono facili da dimenticare, ma, se omessi, possono generare messaggi di errore del compilatore misteriosi.
Sui sistemi più comuni, il valore restituito da main è un indicatore di stato. Un valore di ritorno 0
indica successo. Un valore di ritorno diverso da zero ha un significato definito dal sistema. Normalmente, un valore diverso da zero indica che tipo di errore si è verificato.
Terminologia: Il Concetto di Tipo
I tipi sono uno dei concetti fondamentali nella programmazione e un concetto a cui ritorneremo più volte in questo corso. Un tipo definisce sia il contenuto di un elemento dati sia le operazioni possibili su quei dati.
I dati che i nostri programmi manipolano sono memorizzati in variabili e ogni variabile ha un tipo. Quando il tipo di una variabile chiamata v
è T
, spesso si dice che "v
ha tipo T
" o, in modo intercambiabile, che "v
è un T
".
Compilare ed eseguire il nostro programma
Dopo aver scritto il programma, dobbiamo compilarlo. Il modo in cui si compila un programma dipende dal sistema operativo e dal compilatore. Per i dettagli su come funziona il compilatore specifico, consultare il manuale di riferimento.
Molti compilatori per PC vengono eseguiti da un ambiente di sviluppo integrato (IDE: Integrated Development Environment) che raggruppa il compilatore con strumenti di costruzione e analisi. Questi ambienti possono essere di grande aiuto nello sviluppo di programmi di grandi dimensioni, ma richiedono tempo per imparare a usarli efficacemente. Imparare a usare tali ambienti è ben oltre lo scopo di questo corso.
La maggior parte dei compilatori, inclusi quelli forniti con un IDE, offre un'interfaccia a riga di comando. Se non si conosce ancora l'IDE, può risultare più semplice partire dall'interfaccia a riga di comando. In questo modo si può concentrare sull'apprendimento di C++ prima di tutto. Inoltre, una volta compreso il linguaggio, l'IDE sarà probabilmente più facile da apprendere.
Convenzione di denominazione dei file sorgente
Che si utilizzi un'interfaccia a riga di comando o un IDE, la maggior parte dei compilatori si aspetta che il codice sorgente del programma sia memorizzato in uno o più file.
I file del programma sono normalmente indicati come file sorgente. Sui sistemi più comuni, il nome di un file sorgente termina con un suffisso, ovvero un punto seguito da uno o più caratteri. Il suffisso informa il sistema che il file è un programma C++. I compilatori adottano convenzioni di suffisso differenti; le più comuni sono .cc
, .cxx
, .cpp
, .cp
e .C
.
Eseguire il compilatore dalla riga di comando
Se si utilizza un'interfaccia a riga di comando, tipicamente si compila un programma in una finestra di console (ad esempio una shell su UNIX o il Prompt dei comandi su Windows). Supponendo che il nostro programma main sia in un file chiamato prog1.cpp
, lo potremmo compilare con un comando del tipo
$ gcc prog1.cpp
dove gcc
indica il compilatore e $
è il prompt di sistema. Il compilatore genera un file eseguibile. Su un sistema Windows, tale eseguibile si chiama prog1.exe
. I compilatori UNIX tendono a mettere i loro eseguibili in file chiamati a.out
.
Per eseguire un eseguibile su Windows, si fornisce il nome del file eseguibile e si può omettere l'estensione .exe:
C:\> prog1.exe
Su alcuni sistemi è necessario indicare esplicitamente la posizione del file, anche se il file è nella directory corrente. In tal caso si scrive
C:\> .\prog1.exe
Il ".
" seguito da una barra rovesciata indica che il file è nella directory corrente.
Per eseguire un eseguibile su UNIX, si utilizza il nome completo del file, inclusa l'estensione:
$ a.out
Se occorre specificare la posizione del file, si usa "." seguito da una barra normale per indicare che l'eseguibile è nella directory corrente:
$ ./a.out
Il valore restituito da main è accessibile in modo dipendente dal sistema. Sia su UNIX che su Windows, dopo aver eseguito il programma, è necessario lanciare un comando echo appropriato.
Su sistemi UNIX, otteniamo lo stato scrivendo
$ echo $?
Per vedere lo stato su Windows, scriviamo
C:\> echo %ERRORLEVEL%
Utilizzo del Compilatore GCC e Microsoft Visual Studio
Il comando usato per lanciare il compilatore C++ varia a seconda del compilatore e del sistema operativo. I compilatori più comuni sono il compilatore GNU e i compilatori Microsoft Visual Studio. Per impostazione predefinita, il comando per lanciare il compilatore GNU è g++
. Per compilare il nostro programma prog1.cpp
, useremmo il comando:
$ g++ -o prog1 prog1.cpp
Qui $
è il prompt di sistema. L'opzione -o prog1
è un argomento per il compilatore e indica il nome del file in cui inserire l'eseguibile. Questo comando genera un file eseguibile chiamato prog1
o prog1.exe
, a seconda del sistema operativo. Su UNIX, i file eseguibili non hanno suffisso; su Windows, il suffisso è .exe
. Se l'opzione -o prog1
viene omessa, il compilatore genera un eseguibile chiamato a.out
su UNIX e a.exe
su Windows.
Nota: a seconda della versione del compilatore GNU in uso, potrebbe essere necessario specificare -std=c++11
per abilitare il supporto a C++ 11.
Il comando per lanciare il compilatore Microsoft Visual Studio 2010 è cl
:
C:\work> cl /EHsc prog1.cpp
Qui C:\work>
è il prompt di sistema e \work
è il nome della directory corrente (cioè la cartella corrente). Il comando cl
invoca il compilatore, e /EHsc
è l'opzione che abilita la gestione standard delle eccezioni. Il compilatore Microsoft genera automaticamente un eseguibile con un nome corrispondente al nome del primo file sorgente. L'eseguibile ha il suffisso .exe
e lo stesso nome del file sorgente. In questo caso, l'eseguibile si chiama prog1.exe
.
I compilatori solitamente includono opzioni per generare avvisi su costrutti problematici. È generalmente una buona pratica usare tali opzioni. La nostra preferenza è usare -Wall
con il compilatore GNU e /W4
con i compilatori Microsoft.
Per ulteriori informazioni consultare la guida dell'utente del proprio compilatore.