プログラム
C++ の Hello World プログラムの全体は次のとおりです。Run を押すと、ブラウザ上でコンパイルして実行できます。
表示されるのは1行です。
Hello, World!
コードは5行で、それぞれに決まった役割があります。以下のセクションでは各行を順に見ていき、そのあと同じファイルを自分のコンピューターでビルドする方法と、最初に出るコンパイルエラーの意味を説明します。
1行ずつ見る
#include <iostream>
# で始まる行はプリプロセッサへの指示で、コンパイラ本体より前に実行されます。#include <iostream> は、標準ヘッダー <iostream>(入出力ストリーム)の宣言をその場所に取り込みます。std::cout と std::endl はこのヘッダーで宣言されています。C++ には組み込みの print 文がありません。出力は標準ライブラリの機能であり、この行でそれを使えるようにします。
int main() {
C++ のプログラムは、すべて main という関数から実行を始めます。main はちょうど1つだけ存在しなければならず、小文字で書く必要があります。前にある int は、main が終了時に OS へ整数を返すことを表します。空のカッコは、ここでは引数を受け取らないことを意味し、開き波カッコ { から関数の本体が始まります。
std::cout << "Hello, World!" << std::endl;
実際に出力を行うのはこの行です。
std::coutは標準出力ストリームで、ふつうはターミナルです。std::という接頭辞は、coutがstd名前空間にあることを示します。標準ライブラリ全体はこの名前空間に置かれています。<<は挿入演算子です。右側の値を左側のストリームに送り込みます。連結して書くことができ、<<ごとに次の要素が同じ出力に追加されます。"Hello, World!"は文字列リテラル、つまりダブルクォートで囲んだテキストです。std::endlは行を終わらせます。- セミコロンは文の終わりを示します。C++ の文にはすべてセミコロンが必要です。
return 0;
return は main を終了し、OS に値を返します。慣例として 0 はプログラムの成功を意味し、それ以外の数値はエラーを表します。スクリプトやビルドツールはこの終了コードを読み取ります。main の中では、この行は省略できます。実行が閉じ波カッコに到達すると、C++ は return 0; と書いたものとして動作します。
閉じ波カッコ
閉じ波カッコで main の本体が終わり、それとともにプログラムも終わります。
std::endl と '\n' の違い
行を終わらせる方法は一般的に2つあり、どちらも実際のコードで使われています。
出力:
Hello, World!
Hello again!
Line one
Line two
見た目の結果は同じです。違いは、std::endl が改行を書いたあとにストリームをフラッシュし、バッファにたまったテキストをすぐターミナルへ送り出すことです。'\n' は改行を書くだけで、ストリームは自分のタイミングでフラッシュします(遅くともプログラム終了時)。何千行も出力するループでは、std::endl による余分なフラッシュがはっきりした差になるので、多くの C++ プログラマーはふだん '\n' を使い、テキストをすぐに表示する必要があるときだけ std::endl を使います。3行目のように、\n エスケープは文字列の中でも使えます。cout と cin について詳しくは 入力と出力のページ を参照してください。
using namespace std; を使う書き方
多くのチュートリアルでは、Hello World を次のように書いています。
using namespace std; は、ほかでは見つからない名前を std 名前空間から探すようコンパイラに指示するので、接頭辞なしで cout と endl が使えます。小さなプログラムや練習問題なら問題ありません。大きなコードやヘッダーファイルでは、ふつう避けられます。数百もの標準の名前がスコープに入り込み、自分で定義した名前(たとえば count や distance という関数)と衝突することがあるからです。std::cout と書くのは5文字増えるだけで、このリスクがなくなります。
自分のコンピューターで Hello World をコンパイルして実行する
ブラウザのエディターはコンパイルを代わりに行ってくれます。自分のマシンでは、同じ2つの手順を自分で行います。ソースファイルを実行ファイルにコンパイルし、その実行ファイルを実行します。まず C++ コンパイラをインストールしておく必要があります。Windows、macOS、Linux での導入方法は インストールガイド で説明しています。
プログラムを hello.cpp として保存し、同じフォルダでターミナルを開いてコンパイルします。
g++ hello.cpp -o hello
何も表示されなければ成功で、ソースファイルの隣に hello(Windows では hello.exe)という実行ファイルができています。実行してみましょう。
./hello
Windows では代わりに hello.exe、または単に hello を実行します。macOS では clang++ hello.cpp -o hello でも同じように動き、macOS の g++ はたいてい Clang の別名です。
最初から付けておきたいフラグが2つあります。-std=c++17(または -std=c++20)は言語の規格を選び、-Wall -Wextra は本物のミスを見つける警告を有効にします。
g++ -std=c++17 -Wall -Wextra hello.cpp -o hello
これらのフラグの意味、-o が何をするのか、そして -o を付けないと a.out というファイルができる理由は、C++ のコンパイルのページ で説明しています。
最初によく出るエラー
以下のエラーメッセージは GCC(g++)のものです。Clang ではメッセージの文言が違いますが、指し示す行は同じです。
セミコロンの付け忘れ。
hello.cpp:5:5: error: expected ';' before 'return'
コンパイラは次のトークンに到達して初めて ; がないことに気づくので、行番号はたいていミスの1行後を指します。その前の行の末尾を確認しましょう。
#include <iostream> の書き忘れ。
error: 'cout' is not a member of 'std'
std::cout は <iostream> で宣言されています。ファイルの先頭にインクルードを追加しましょう。
std:: の付け忘れ。
error: 'cout' was not declared in this scope; did you mean 'std::cout'?
std::cout と std::endl と書くか、インクルードのあとに using namespace std; を追加します。
main ではなく Main と書く。 C++ は大文字と小文字を区別します。int Main() のプログラムはコンパイルは通りますが、リンクの段階で undefined reference to 'main' となって失敗します。プログラムの開始点となる関数をリンカーが見つけられないためです。
g++ ではなく gcc でコンパイルする。 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++ ではありません。ヘッダーは .h の付かない <iostream> で、main は int を返さなければなりません。最近のコンパイラはどちらも受け付けません。
C++23 の std::println で出力する
C++23 では、1行を出力するもっと短い方法として、<print> ヘッダーの std::println が追加されました。
#include <print>
int main() {
std::println("Hello, World!");
}
改行は自動で付き、値を埋め込む {} プレースホルダーも使えます。GCC 14、libc++ を使う Clang 18、最近のバージョンの Visual Studio で対応しており、-std=c++23 が必要です。既存のコードやチュートリアルのほとんどはまだ std::cout を使っているので、両方に慣れておく価値があります。
よくある質問
C++でHello Worldはどう書きますか?
まず #include <iostream> を書き、int main() を定義して、その中に std::cout << "Hello, World!" << std::endl; と return 0; を書きます。ファイルを hello.cpp として保存し、g++ hello.cpp -o hello でコンパイルして、./hello で実行します。
C++のHello Worldに #include <iostream> が必要なのはなぜですか?
std::cout と std::endl は言語に組み込まれているのではなく、<iostream> ヘッダーで宣言されています。インクルードしないとコンパイラはこれらの名前を知らず、'cout' is not a member of 'std' のようなエラーで止まります。
std::endl と '\n' の違いは何ですか?
どちらも行を終わらせます。std::endl はさらに出力バッファをフラッシュし、テキストをすぐに書き出させます。'\n' は改行を書くだけで、フラッシュはストリームの都合のよいときに任せるので、何行も出力する場合は速くなります。Hello World の1行だけなら、見た目の違いはありません。
C++の main の最後に return 0 は必要ですか?
必要ありません。main は C++ で return を省略できる唯一の関数で、閉じ波カッコに到達すると return 0; と書いたものとして扱われます。これはプログラムが成功したことを OS に伝えます。終了ステータスを明示するために、あえて書く人も多くいます。