コメント(// と /* */)
『C++』のコメントは『//』による一行コメントと『/* */』によるブロックコメントの2種類があります。C言語の『/* */』をそのまま継承しつつ、C++では最初のバージョンから『//』も使えます。コメントはコンパイラが処理する前の段階で取り除かれるため、実行バイナリには含まれません。
構文
// 一行コメント — // から行末までがコメントになります。 int x = 10; // 行末コメント — コードの後にも書けます。 /* ブロックコメント — /* から */ までの範囲がコメントになります。 複数行にわたるコメントを書くときに使います。 */ /* * 関数やクラスの説明には /* */ を使うのが慣習です。 * アスタリスクを行頭に揃えると視認性が高まります。 */ /** * Doxygenコメント — /** で始めるブロックコメントです。 * @param 引数名 引数の説明 * @return 戻り値の説明 */
コメントの種類
| 種類 | 書き方 | 概要 |
|---|---|---|
| 一行コメント | // テキスト | 『//』から行末までがコメントになります。C++の最初の仕様から使えます。コードの右側に短い補足を添えるときによく使います。 |
| ブロックコメント | /* テキスト */ | 複数行にまたがるコメントを書くときに使います。入れ子にはできません。 |
| Doxygenコメント | /** テキスト */ | 『/**』で始まるブロックコメントです。Doxygenというドキュメント生成ツールが解析できる形式で引数・戻り値・例外などの情報を記述します。 |
Doxygenの主なタグ
Doxygenコメントでは、『@』または『\』で始まるタグを使って情報を記述します。Doxygenを実行するとHTMLやPDFのAPIドキュメントを自動生成できます。VS CodeなどのエディタもDoxygenを読み取ってホバー表示に活用します。
| タグ | 概要 |
|---|---|
| @param 名前 説明 | 関数の引数の説明を記述します。引数ごとに1行書きます。 |
| @return 説明 | 関数の戻り値を説明します。 |
| @throws 例外クラス 説明 | スローされる可能性のある例外を記述します。 |
| @brief 説明 | クラスや関数の短い説明を1行で書きます。 |
| @note テキスト | 補足情報や注意事項を記述します。 |
| @see 参照先 | 関連するクラスや関数への参照を記述します。 |
| @deprecated 説明 | 非推奨であることを示し、代替手段を案内します。 |
| @tparam 型パラメータ名 説明 | テンプレートの型引数を説明します。 |
コメントを書くべき場所・書かなくてよい場所
| 判断 | 場面 | 理由 |
|---|---|---|
| 書くべき | 「なぜこう実装したか」の理由 | コードを読むだけではわからない設計意図やトレードオフを残しておくと、将来の自分や他の開発者が助かります。 |
| 書くべき | 複雑なアルゴリズムや計算式 | 何をしているか一見でわかりにくい処理には、動作の概要を補足します。 |
| 書くべき | 公開APIや再利用するクラス・関数 | Doxygenコメントで引数・戻り値・例外・副作用を明示しておくと、呼び出し側がドキュメントを参照しなくても使えます。 |
| 書くべき | デバッグ中の一時的な無効化 | コメントアウトした理由や期限を残しておくと、後で削除し忘れるリスクが減ります。 |
| 書かなくてよい | コードを読めば明らかな処理 | 『// i に 1 を加算する』のような自明な説明はノイズになります。変数名・関数名をわかりやすくすれば不要になります。 |
| 書かなくてよい | 変更履歴・削除したコード | バージョン管理(git)があるため、コメントに古いコードや変更日を残す必要はありません。 |
サンプルコード
comment_basic.cpp
// comment_basic.cpp — C++のコメント構文の基本的な使い方です。
// コンパイル: g++ -std=c++17 -o comment_basic comment_basic.cpp
#include <iostream>
#include <string>
/* 配列の要素数を定数として定義します */
const int ITEM_COUNT = 3;
int main() {
// 商品名と価格を並行して管理します
std::string items[ITEM_COUNT] = {"widget", "gadget", "device"};
int prices[ITEM_COUNT] = {1200, 3500, 800};
int total = 0; // 合計金額(税抜)
for (int i = 0; i < ITEM_COUNT; i++) {
std::cout << items[i] << ": " << prices[i] << " yen\n";
total += prices[i];
}
std::cout << "Total: " << total << " yen\n";
return 0;
}
同じ処理を次のようにも書けます。
$ g++ -std=c++17 -o comment_basic comment_basic.cpp && ./comment_basic widget: 1200 yen gadget: 3500 yen device: 800 yen Total: 5500 yen
comment_doxygen.cpp
// comment_doxygen.cpp — Doxygenコメントを使って関数を文書化する例です。
// コンパイル: g++ -std=c++17 -o comment_doxygen comment_doxygen.cpp
#include <iostream>
#include <stdexcept>
#include <vector>
/**
* @brief 整数ベクターの平均値を計算します。
*
* 要素の合計を要素数で割った値を返します。
* 空のベクターが渡された場合は std::invalid_argument をスローします。
*
* @param values 平均を計算する整数のベクター
* @return 平均値(double)
* @throws std::invalid_argument values が空の場合
*/
double calculate_average(const std::vector<int>& values) {
if (values.empty()) {
// 空ベクターは計算不能なので例外をスローします
throw std::invalid_argument("values must not be empty");
}
int sum = 0;
for (int v : values) {
sum += v;
}
/* 整数除算を避けるためキャストします */
return static_cast<double>(sum) / values.size();
}
int main() {
std::vector<int> scores = {85, 92, 78, 95, 60};
std::cout << "Average: " << calculate_average(scores) << "\n";
return 0;
}
同じ処理を次のようにも書けます。
$ g++ -std=c++17 -o comment_doxygen comment_doxygen.cpp && ./comment_doxygen Average: 82
よくあるミス
ブロックコメントをネストする
ブロックコメントは入れ子にできません。『/*』の中に『/*』を書いても、最初の『*/』でコメントが閉じてしまいます。すでに『/* */』を含むコードブロックをまとめてコメントアウトしたい場合は、条件コンパイル(『#if 0』)を使います。
/* 外側 /* 内側 */ これ以降がコードとして解釈される — NG */ #if 0 /* すでにコメントがある行 */ int x = 10; /* 既存コメント付きのコード */ #endif
概要
C++のコメントは『//』と『/* */』の2種類です。一行コメント(『//』)はコードの右側に短い補足を添えるときや、処理を1行だけコメントアウトするときによく使われます。ブロックコメント(『/* */』)は複数行にわたる説明を書くときに使います。ブロックコメントは入れ子にできない点に注意が必要で、既存のコメントを含むコードをまとめてコメントアウトしたい場合は『#if 0 〜 #endif』を使う慣習があります。
Doxygenコメント(『/**』で始めるブロックコメント)を関数やクラスの直前に書くと、Doxygenでソースコードからプロジェクト全体のAPIドキュメントを自動生成できます。VS CodeなどのエディタはDoxygenを読み取ってホバー表示に活用するため、パブリックAPIに付けておくと利便性が高まります。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。