Menu

Hello World em C++: seu primeiro programa, linha por linha

O programa Hello World em C++ explicado linha por linha: #include <iostream>, int main(), std::cout e <<, std::endl contra '\n', return 0, e como compilar e corrigir os primeiros erros de quem está começando.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

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 prefixo std:: diz que cout fica no namespace std, 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::endl termina 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.

Ilustração das linguagens de programação do Coddy

Aprenda a programar com o Coddy

COMEÇAR