Program
Oto kompletny program Hello World w C++. Naciśnij Run, aby skompilować go i uruchomić w przeglądarce:
Wypisuje jedną linię:
Hello, World!
Pięć linijek kodu i każda ma konkretne zadanie. Kolejne sekcje omawiają je po kolei, a potem pokazują, jak zbudować ten sam plik na własnym komputerze i co zwykle oznaczają pierwsze błędy kompilatora.
Linijka po linijce
#include <iostream>
Linie zaczynające się od # to polecenia dla preprocesora, który działa przed właściwym kompilatorem. #include <iostream> wkleja deklaracje ze standardowego nagłówka <iostream> (strumienie wejścia i wyjścia). To właśnie w tym nagłówku zadeklarowane są std::cout i std::endl. C++ nie ma wbudowanej instrukcji print; wypisywanie należy do biblioteki standardowej, a tą linijką je włączasz.
int main() {
Każdy program w C++ zaczyna działanie od funkcji o nazwie main. Musi być dokładnie jedna i musi być zapisana małymi literami. int przed nią oznacza, że main po zakończeniu zwraca liczbę całkowitą do systemu operacyjnego. Puste nawiasy znaczą, że tutaj nie przyjmuje argumentów, a klamra otwierająca { rozpoczyna ciało funkcji.
std::cout << "Hello, World!" << std::endl;
Ta linijka faktycznie wypisuje tekst.
std::coutto standardowy strumień wyjścia, zwykle terminal. Przedrostekstd::mówi, żecoutnależy do przestrzeni nazwstd, w której trzymana jest cała biblioteka standardowa.<<to operator wstawiania. Wysyła wartość stojącą po jego prawej stronie do strumienia po lewej. Można go łączyć w łańcuch, a każde kolejne<<dokłada następny fragment do tego samego wyjścia."Hello, World!"to literał tekstowy: tekst w cudzysłowie.std::endlkończy linię.- Średnik kończy instrukcję. Każda instrukcja w C++ go potrzebuje.
return 0;
return kończy main i przekazuje wartość systemowi operacyjnemu. Zgodnie z konwencją 0 oznacza sukces, a każda inna liczba sygnalizuje błąd. Ten kod wyjścia odczytują skrypty i narzędzia do budowania. Wewnątrz main ta linijka jest opcjonalna: jeśli wykonanie dojdzie do zamykającej klamry, C++ zachowuje się tak, jakby było tam return 0;.
Klamra zamykająca
Klamra zamykająca kończy ciało main, a wraz z nim cały program.
std::endl a '\n'
Są dwa popularne sposoby kończenia linii i oba występują w prawdziwym kodzie:
Wynik:
Hello, World!
Hello again!
Line one
Line two
Widoczny efekt jest taki sam. Różnica polega na tym, że std::endl zapisuje znak nowej linii, a potem opróżnia strumień, co od razu wypycha zbuforowany tekst do terminala. '\n' zapisuje tylko znak nowej linii, a strumień opróżnia się według własnego harmonogramu (najpóźniej przy zakończeniu programu). W pętli, która wypisuje tysiące linii, dodatkowe opróżnienia przez std::endl dają mierzalną różnicę, dlatego wielu programistów C++ domyślnie używa '\n', a std::endl tylko wtedy, gdy tekst musi pojawić się natychmiast. Sekwencja \n działa też wewnątrz napisu, co pokazuje trzecia linijka. Strona o wejściu i wyjściu omawia cout i cin dokładniej.
Wersja z using namespace std;
Wiele poradników zapisuje Hello World tak:
using namespace std; każe kompilatorowi szukać w przestrzeni nazw std nazw, których nie znajdzie gdzie indziej, więc cout i endl działają bez przedrostka. W małych programach i ćwiczeniach to w porządku. W większym kodzie i w plikach nagłówkowych zwykle się tego unika, bo wciąga to do zasięgu setki standardowych nazw, które mogą kolidować z twoimi (na przykład z twoją funkcją o nazwie count albo distance). Pisanie std::cout kosztuje pięć znaków i usuwa to ryzyko.
Kompilacja i uruchomienie Hello World na komputerze
Edytor w przeglądarce kompiluje za ciebie. Na własnym komputerze wykonujesz te same dwa kroki samodzielnie: kompilujesz plik źródłowy do pliku wykonywalnego, a potem uruchamiasz ten plik. Najpierw potrzebujesz zainstalowanego kompilatora C++; poradnik instalacji pokazuje, jak go skonfigurować w Windows, macOS i Linuksie.
Zapisz program jako hello.cpp, otwórz terminal w tym samym folderze i skompiluj go:
g++ hello.cpp -o hello
Jeśli nic się nie wypisało, wszystko zadziałało i obok pliku źródłowego jest teraz plik wykonywalny hello (hello.exe w Windows). Uruchom go:
./hello
W Windows uruchom zamiast tego hello.exe albo po prostu hello. W macOS clang++ hello.cpp -o hello działa tak samo, a g++ jest tam zwykle Clangiem pod inną nazwą.
Od początku warto dodawać dwie flagi: -std=c++17 (albo -std=c++20) wybiera standard języka, a -Wall -Wextra włącza ostrzeżenia, które wyłapują prawdziwe błędy:
g++ -std=c++17 -Wall -Wextra hello.cpp -o hello
Strona o kompilacji C++ wyjaśnia, co robią te flagi, co znaczy -o i dlaczego bez niej dostajesz plik o nazwie a.out.
Częste pierwsze błędy
Poniższe komunikaty pochodzą z GCC (g++). Clang formułuje je inaczej, ale wskazuje tę samą linię.
Brakujący średnik.
hello.cpp:5:5: error: expected ';' before 'return'
Kompilator zauważa brak ; dopiero przy następnym tokenie, więc numer linii zwykle wskazuje linię po błędzie. Sprawdź koniec poprzedniej linii.
Brakujące #include <iostream>.
error: 'cout' is not a member of 'std'
std::cout jest zadeklarowane w <iostream>. Dodaj include na początku pliku.
Brakujące std::.
error: 'cout' was not declared in this scope; did you mean 'std::cout'?
Albo pisz std::cout i std::endl, albo dodaj using namespace std; po include.
Main zamiast main. C++ rozróżnia wielkość liter. Program z int Main() się kompiluje, ale potem pada na etapie linkowania z komunikatem undefined reference to 'main', bo linker nie może znaleźć funkcji, od której program ma wystartować.
Kompilacja przez gcc zamiast g++. gcc hello.cpp kompiluje kod C++, ale nie linkuje biblioteki standardowej C++, więc dostajesz długą listę błędów undefined reference to std::.... Do plików C++ używaj g++ (albo clang++).
Drukarskie cudzysłowy. Kod skopiowany z edytora tekstu albo strony internetowej może zawierać cudzysłowy typograficzne (“Hello”) zamiast prostych ("Hello"). GCC zgłasza wtedy stray '\342' in program. Wpisz cudzysłowy ponownie w swoim edytorze.
Stare nagłówki i void main. Niektóre bardzo stare poradniki używają #include <iostream.h> albo void main(). Żadne z nich nie jest standardowym C++: nagłówek to <iostream> bez .h, a main musi zwracać int. Nowoczesne kompilatory odrzucają oba zapisy.
Wypisywanie przez std::println w C++23
C++23 dodał krótszy sposób wypisania linii, std::println z nagłówka <print>:
#include <print>
int main() {
std::println("Hello, World!");
}
Sam dodaje znak nowej linii i obsługuje miejsca na wartości {}. Obsługa pojawiła się w GCC 14, Clangu 18 z libc++ i nowszych wersjach Visual Studio, a wymaga -std=c++23. Większość istniejącego kodu i poradników nadal używa std::cout, więc warto swobodnie posługiwać się obydwoma.
Najczęściej zadawane pytania
Jak napisać Hello World w C++?
Zacznij od #include <iostream>, potem zdefiniuj int main() i umieść w niej std::cout << "Hello, World!" << std::endl;, a po tym return 0;. Zapisz plik jako hello.cpp, skompiluj go poleceniem g++ hello.cpp -o hello i uruchom ./hello.
Dlaczego Hello World w C++ potrzebuje #include <iostream>?
std::cout i std::endl są zadeklarowane w nagłówku <iostream>, a nie wbudowane w język. Bez tego include kompilator nie zna tych nazw i zatrzymuje się z błędem w rodzaju 'cout' is not a member of 'std'.
Czym się różni std::endl od '\n'?
Oba kończą linię. std::endl dodatkowo opróżnia bufor wyjścia, więc tekst trafia na ekran od razu. '\n' zapisuje tylko znak nowej linii i pozwala strumieniowi opróżnić bufor, kiedy będzie gotowy, co jest szybsze przy wypisywaniu wielu linii. Przy jednej linijce Hello World nie widać żadnej różnicy.
Czy na końcu main w C++ potrzebne jest return 0?
Nie. main to jedyna funkcja, w której C++ pozwala pominąć return; dojście do zamykającej klamry jest traktowane jak return 0;, co mówi systemowi operacyjnemu, że program zakończył się sukcesem. Wiele osób i tak to pisze, żeby kod wyjścia był jawny.