O programa
Este é o programa Hello World completo em C++. Aperte Run para compilar e executar no navegador:
Ele imprime uma linha:
Hello, World!
Cinco linhas de código, e cada uma tem uma função específica. As seções abaixo passam por elas em ordem e depois mostram como compilar o mesmo arquivo no seu computador e o que os primeiros erros do compilador costumam significar.
Linha por linha
#include <iostream>
Linhas que começam com # são instruções para o pré-processador, que roda antes do compilador propriamente dito. #include <iostream> insere as declarações do header padrão <iostream> (streams de entrada e saída). É nesse header que std::cout e std::endl são declarados. O C++ não tem um comando de impressão embutido; imprimir faz parte da biblioteca padrão, e você passa a ter acesso a ela com essa linha.
int main() {
Todo programa C++ começa a rodar por uma função chamada main. Tem que existir exatamente uma, escrita em minúsculas. O int antes dela diz que main devolve um inteiro ao sistema operacional quando termina. Os parênteses vazios indicam que ela não recebe argumentos aqui, e a chave de abertura { inicia o corpo da função.
std::cout << "Hello, World!" << std::endl;
Esta linha faz a impressão de fato.
std::couté o stream de saída padrão, normalmente o terminal. O prefixostd::diz quecoutfica no namespacestd, onde está toda a biblioteca padrão.<<é o operador de inserção. Ele envia o valor à direita para o stream à esquerda. Dá para encadeá-lo, e cada<<adiciona a próxima parte à mesma saída."Hello, World!"é um literal de string: texto entre aspas duplas.std::endltermina a linha.- O ponto e vírgula termina a instrução. Toda instrução em C++ precisa de um.
return 0;
return encerra o main e devolve um valor ao sistema operacional. Por convenção, 0 significa que o programa terminou com sucesso, e qualquer outro número sinaliza um erro. Scripts e ferramentas de build leem esse código de saída. Dentro do main a linha é opcional: se a execução chega à chave de fechamento, o C++ se comporta como se você tivesse escrito return 0;.
A chave de fechamento
A chave de fechamento termina o corpo do main e, com ele, o programa.
std::endl vs '\n'
Há duas formas comuns de terminar uma linha, e as duas aparecem em código real:
Saída:
Hello, World!
Hello again!
Line one
Line two
O resultado visível é o mesmo. A diferença é que std::endl escreve uma quebra de linha e depois faz flush do stream, empurrando para o terminal na hora qualquer texto que esteja no buffer. '\n' escreve só a quebra de linha, e o stream faz o flush no seu próprio ritmo (no máximo quando o programa termina). Num laço que imprime milhares de linhas, os flushes extras do std::endl fazem uma diferença mensurável, então muitos programadores C++ usam '\n' por padrão e deixam o std::endl para quando o texto precisa aparecer imediatamente. O escape \n também funciona dentro de uma string, como mostra a terceira linha. A página de entrada e saída aprofunda cout e cin.
A versão com using namespace std;
Muitos tutoriais escrevem o Hello World assim:
using namespace std; diz ao compilador para procurar no namespace std os nomes que ele não encontraria de outra forma, então cout e endl funcionam sem o prefixo. Tudo bem em programas pequenos e exercícios. Em código maior e em arquivos de header costuma ser evitado, porque traz centenas de nomes da biblioteca padrão para o escopo, e eles podem colidir com os seus (uma função sua chamada count ou distance, por exemplo). Escrever std::cout custa cinco caracteres e elimina o risco.
Compilando e rodando o Hello World no seu computador
O editor do navegador compila para você. Na sua máquina você mesmo faz os dois passos: compila o arquivo-fonte num executável e depois roda o executável. Antes, é preciso ter um compilador C++ instalado; o guia de instalação mostra como configurar um no Windows, no macOS e no Linux.
Salve o programa como hello.cpp, abra um terminal na mesma pasta e compile:
g++ hello.cpp -o hello
Se nada for impresso, funcionou, e agora existe um executável chamado hello (hello.exe no Windows) ao lado do arquivo-fonte. Rode-o:
./hello
No Windows, rode hello.exe ou só hello. No macOS, clang++ hello.cpp -o hello funciona do mesmo jeito, e o g++ de lá normalmente é o Clang com outro nome.
Vale adicionar duas flags desde o começo: -std=c++17 (ou -std=c++20) escolhe o padrão da linguagem, e -Wall -Wextra ativa avisos que pegam erros reais:
g++ -std=c++17 -Wall -Wextra hello.cpp -o hello
A página sobre compilar C++ explica o que essas flags fazem, o que -o significa e por que sem ela você recebe um arquivo chamado a.out.
Primeiros erros comuns
As mensagens abaixo são do GCC (g++). O Clang escreve as mensagens de outro jeito, mas aponta para a mesma linha.
Ponto e vírgula faltando.
hello.cpp:5:5: error: expected ';' before 'return'
O compilador só percebe o ; faltando quando chega ao próximo token, então o número da linha costuma apontar para uma linha depois do erro. Confira o fim da linha anterior.
#include <iostream> faltando.
error: 'cout' is not a member of 'std'
std::cout é declarado em <iostream>. Adicione o include no topo do arquivo.
std:: faltando.
error: 'cout' was not declared in this scope; did you mean 'std::cout'?
Escreva std::cout e std::endl, ou adicione using namespace std; depois do include.
Main em vez de main. O C++ diferencia maiúsculas de minúsculas. Um programa com int Main() compila, mas falha na etapa de linkagem com undefined reference to 'main', porque o linker não encontra a função pela qual o programa deveria começar.
Compilar com gcc em vez de g++. gcc hello.cpp compila o código C++, mas não linka a biblioteca padrão do C++, e você recebe uma longa lista de erros undefined reference to std::.... Use g++ (ou clang++) para arquivos C++.
Aspas curvas. Código copiado de um editor de texto ou de uma página web pode conter aspas tipográficas (“Hello”) em vez de aspas retas ("Hello"). O GCC acusa stray '\342' in program. Redigite as aspas no seu editor.
Headers antigos e void main. Alguns tutoriais muito antigos usam #include <iostream.h> ou void main(). Nenhum dos dois é C++ padrão: o header é <iostream>, sem .h, e main precisa retornar int. Compiladores modernos rejeitam os dois.
Imprimindo com std::println no C++23
O C++23 trouxe uma forma mais curta de imprimir uma linha, std::println, do header <print>:
#include <print>
int main() {
std::println("Hello, World!");
}
Ele adiciona a quebra de linha por você e aceita placeholders {} para valores. O suporte chegou no GCC 14, no Clang 18 com libc++ e em versões recentes do Visual Studio, e exige -std=c++23. A maior parte do código e dos tutoriais existentes ainda usa std::cout, então vale dominar os dois.
Perguntas frequentes
Como escrever Hello World em C++?
Comece com #include <iostream>, depois defina int main() e coloque dentro dela std::cout << "Hello, World!" << std::endl;, seguido de return 0;. Salve o arquivo como hello.cpp, compile com g++ hello.cpp -o hello e rode ./hello.
Por que o Hello World em C++ precisa de #include <iostream>?
std::cout e std::endl são declarados no header <iostream>, não fazem parte da linguagem em si. Sem o include o compilador não conhece esses nomes e para com um erro como 'cout' is not a member of 'std'.
Qual a diferença entre std::endl e '\n'?
Os dois terminam a linha. std::endl também faz flush do buffer de saída, forçando o texto a sair na hora. '\n' só escreve a quebra de linha e deixa o stream fazer o flush quando estiver pronto, o que é mais rápido quando você imprime muitas linhas. Numa única linha de Hello World não há diferença visível.
Preciso de return 0 no fim do main em C++?
Não. main é a única função em que o C++ deixa você omitir o return; chegar à chave de fechamento é tratado como return 0;, que diz ao sistema operacional que o programa terminou com sucesso. Muita gente escreve mesmo assim para deixar o código de saída explícito.