Программа
Вот полная программа Hello World на C++. Нажмите Run, чтобы скомпилировать и выполнить её прямо в браузере:
Она печатает одну строку:
Hello, World!
Пять строк кода, и у каждой своя задача. Ниже они разобраны по порядку, а затем показано, как собрать тот же файл на своём компьютере и что обычно означают первые ошибки компилятора.
Строка за строкой
#include <iostream>
Строки, начинающиеся с #, это инструкции для препроцессора, который работает до самого компилятора. #include <iostream> вставляет объявления из стандартного заголовка <iostream> (потоки ввода и вывода). Именно в этом заголовке объявлены std::cout и std::endl. Встроенной инструкции печати в C++ нет: вывод это часть стандартной библиотеки, и эта строка её подключает.
int main() {
Любая программа на C++ начинает выполнение с функции main. Она должна быть ровно одна и записана строчными буквами. int перед ней говорит, что по завершении main возвращает операционной системе целое число. Пустые скобки означают, что здесь она не принимает аргументов, а открывающая фигурная скобка { начинает тело функции.
std::cout << "Hello, World!" << std::endl;
Эта строка и выполняет печать.
std::coutэто стандартный поток вывода, обычно терминал. Префиксstd::говорит, чтоcoutнаходится в пространстве имёнstd, где хранится вся стандартная библиотека.<<это оператор вставки. Он отправляет значение справа от себя в поток слева. Его можно выстраивать в цепочку, и каждый<<добавляет следующий фрагмент к тому же выводу."Hello, World!"это строковый литерал: текст в двойных кавычках.std::endlзавершает строку.- Точка с запятой завершает инструкцию. Она нужна каждой инструкции в C++.
return 0;
return завершает main и передаёт значение операционной системе. По соглашению 0 означает, что программа завершилась успешно, а любое другое число сигнализирует об ошибке. Этот код возврата читают скрипты и инструменты сборки. Внутри main эта строка необязательна: если выполнение доходит до закрывающей скобки, C++ ведёт себя так, будто вы написали return 0;.
Закрывающая скобка
Закрывающая фигурная скобка завершает тело main, а вместе с ним и программу.
std::endl против '\n'
Есть два распространённых способа завершить строку, и оба встречаются в реальном коде:
Вывод:
Hello, World!
Hello again!
Line one
Line two
Видимый результат одинаковый. Разница в том, что std::endl записывает перевод строки, а затем сбрасывает поток, сразу выталкивая весь накопленный в буфере текст в терминал. '\n' записывает только перевод строки, а поток сбрасывается по своему расписанию (самое позднее при завершении программы). В цикле, который печатает тысячи строк, лишние сбросы от std::endl дают ощутимую разницу, поэтому многие программисты на C++ по умолчанию пишут '\n' и используют std::endl, только когда текст должен появиться немедленно. Управляющая последовательность \n работает и внутри строки, как показывает третья строка. Подробнее cout и cin разобраны на странице про ввод и вывод.
Версия с using namespace std;
Во многих учебниках Hello World пишут так:
using namespace std; говорит компилятору искать в пространстве имён std имена, которые иначе он не найдёт, поэтому cout и endl работают без префикса. Для небольших программ и упражнений это нормально. В больших проектах и в заголовочных файлах так обычно не делают, потому что это втягивает в область видимости сотни стандартных имён, и они могут конфликтовать с вашими (например, с вашей функцией count или distance). Запись std::cout стоит пяти символов и снимает этот риск.
Компиляция и запуск Hello World на своём компьютере
Редактор в браузере компилирует за вас. На своей машине вы делаете те же два шага сами: компилируете исходный файл в исполняемый файл, а затем запускаете исполняемый файл. Сначала нужно установить компилятор C++; как это сделать в Windows, macOS и Linux, описано в руководстве по установке.
Сохраните программу как hello.cpp, откройте терминал в той же папке и скомпилируйте её:
g++ hello.cpp -o hello
Если ничего не напечаталось, всё получилось, и рядом с исходным файлом теперь лежит исполняемый файл hello (hello.exe в Windows). Запустите его:
./hello
В Windows вместо этого запустите hello.exe или просто hello. В macOS так же работает clang++ hello.cpp -o hello, а g++ там обычно и есть Clang под другим именем.
Два флага стоит добавлять с самого начала: -std=c++17 (или -std=c++20) выбирает стандарт языка, а -Wall -Wextra включает предупреждения, которые ловят настоящие ошибки:
g++ -std=c++17 -Wall -Wextra hello.cpp -o hello
На странице про компиляцию C++ объяснено, что делают эти флаги, что означает -o и почему без него получается файл a.out.
Частые первые ошибки
Тексты ошибок ниже взяты из GCC (g++). Clang формулирует сообщения иначе, но указывает на ту же строку.
Пропущенная точка с запятой.
hello.cpp:5:5: error: expected ';' before 'return'
Компилятор замечает пропущенную ;, только когда доходит до следующего токена, поэтому номер строки обычно указывает на строку после ошибки. Проверьте конец предыдущей строки.
Нет #include <iostream>.
error: 'cout' is not a member of 'std'
std::cout объявлен в <iostream>. Добавьте include в начало файла.
Нет std::.
error: 'cout' was not declared in this scope; did you mean 'std::cout'?
Либо пишите std::cout и std::endl, либо добавьте using namespace std; после include.
Main вместо main. C++ различает регистр. Программа с int Main() компилируется, но падает на этапе компоновки с undefined reference to 'main', потому что компоновщик не находит функцию, с которой программа должна начинаться.
Компиляция через gcc вместо g++. gcc hello.cpp компилирует код на C++, но не подключает стандартную библиотеку C++, и вы получаете длинный список ошибок undefined reference to std::.... Для файлов C++ используйте g++ (или clang++).
Типографские кавычки. Код, скопированный из текстового редактора или с веб-страницы, может содержать типографские кавычки (“Hello”) вместо прямых ("Hello"). GCC сообщает stray '\342' in program. Наберите кавычки заново в своём редакторе.
Старые заголовки и void main. В некоторых очень старых учебниках используют #include <iostream.h> или void main(). Ни то, ни другое не является стандартным C++: заголовок называется <iostream> без .h, а main должна возвращать int. Современные компиляторы отвергают оба варианта.
Печать через std::println в C++23
В C++23 появился более короткий способ напечатать строку: std::println из заголовка <print>:
#include <print>
int main() {
std::println("Hello, World!");
}
Он сам добавляет перевод строки и поддерживает заполнители {} для значений. Поддержка появилась в GCC 14, в Clang 18 с libc++ и в свежих версиях Visual Studio, и для неё нужен -std=c++23. Большая часть существующего кода и учебников по-прежнему использует std::cout, так что стоит свободно владеть обоими способами.
Часто задаваемые вопросы
Как написать Hello World на C++?
Начните с #include <iostream>, затем определите int main() и поместите внутрь std::cout << "Hello, World!" << std::endl;, а после этого return 0;. Сохраните файл как hello.cpp, скомпилируйте его командой g++ hello.cpp -o hello и запустите ./hello.
Зачем Hello World на C++ нужен #include <iostream>?
std::cout и std::endl объявлены в заголовке <iostream>, а не встроены в язык. Без этого include компилятор не знает этих имён и останавливается с ошибкой вроде 'cout' is not a member of 'std'.
В чём разница между std::endl и '\n'?
Оба завершают строку. std::endl к тому же сбрасывает буфер вывода, сразу выталкивая текст наружу. '\n' только записывает перевод строки и позволяет потоку сбросить буфер, когда он будет готов, а это быстрее, когда вы печатаете много строк. Для одной строки Hello World видимой разницы нет.
Нужен ли return 0 в конце main в C++?
Нет. main единственная функция, в которой C++ разрешает опустить return: достижение закрывающей скобки считается как return 0;, то есть сообщает операционной системе, что программа завершилась успешно. Многие всё равно его пишут, чтобы код возврата был виден явно.