1.

C++のコメントアウトの書き方|//と/* */の使い分けと注意点

編集

C++のコメントアウト

C++では「//」を書くとその行の末尾までが、「/*」と「*/」で囲んだ範囲がコメントとして扱われ、コンパイル時に無視される。コードを消さずに一時的に無効化する「コメントアウト」もこの2つで行う。

この記事の要点
  • 行コメントは「//」。書いた位置からその行の終わりまでがコメントになる。
  • ブロックコメントは「/*」から「*/」まで。複数行にまたがってまとめて無効化できる。
  • 1行や行末のメモは「//」、数行〜十数行をまとめて消すなら「/* */」が基本。
  • デバッグ中に処理を一時的に外す「コメントアウト」も同じ書き方で行う。
  • /* */」は入れ子(ネスト)にできない。最初に現れた「*/」でコメントが終わるため注意。
  • 大きな範囲をまとめて無効化したいときは「#if 0 ~ #endif」が安全で確実。
  • Doxygen等のドキュメント生成では「///」や「/** */」というドキュメントコメントを使う。

コメントとは

コメントとは、ソースコード中に書く「プログラムとしては実行されない説明文・メモ」のことである。コンパイラはコメント部分を読み飛ばすため、何を書いてもプログラムの動作には影響しない。日本語でもよい。

主な用途は次の2つである。

  • 説明を残す… 処理の意図や注意点を人間向けに書いておく。
  • コードを一時的に無効化する… 動くコードをコメントにして実行されないようにする。これを特にコメントアウトと呼ぶ。

C++には書き方が2種類ある。「//」で始める行コメントと、「/*」「*/」で囲むブロックコメントである。順に見ていく。

「//」行コメント(単一行コメント)

//」を書くと、そこからその行の終わり(改行)までがコメントになる。1行単位のメモや、コードの右側に補足を書くのに向く。C++では最もよく使われる形式である。

#include <iostream>

 

int main() {

    // これは行コメント(この行は無視される)

    std::cout << "Hello";  // 行末に補足を書ける

    return 0;

}

「//」よりにあるコード(上の例の std::cout << "Hello";)はそのまま実行され、「//」より後ろだけがコメントになる点に注意する。

「/* */」ブロックコメント(複数行コメント)

/*」から「*/」までがコメントになる。改行をまたいでもよいため、複数行をまとめて無効化したり、長めの説明を書いたりするのに向く。

int main() {

    /* ここから

       複数行にわたって

       コメントにできる ここまで */

    int a = 1; /* 行の途中だけ */ int b = 2;

    return 0;

}

「/* */」は行の途中にも置けるので、上の例の int a = 1; /* … */ int b = 2; のように、式の一部分だけを囲んで無効化することもできる。

「//」と「/* */」の使い分け

書き方 範囲 向いている用途
// 行コメント 「//」からその行末まで 1行のメモ、行末への補足、1行だけの無効化
/* */ ブロックコメント 「/*」から最初の「*/」まで(複数行可) 数行〜十数行のまとめた無効化、長い説明、行の途中の一部分

迷ったら、1行や行末は「//」、複数行まとめてなら「/* */」と覚えておけばよい。実務では行コメント「//」が主役で、ブロックコメントは範囲を広く囲みたいときに使う、という配分が一般的である。

デバッグでの一時無効化(コメントアウト)

プログラムが思った通りに動かないとき、一部の処理を消さずに実行だけ止めて、原因を切り分けたいことがある。このときコードをコメントにして無効化するのがコメントアウトである。あとで「//」や「/* */」を外せば、すぐ元のコードに戻せる。

int main() {

    int x = 10;

    // x = 20;  // この行だけ実行されない(一時的に無効化)

    std::cout << x;  // 10 が出力される

    return 0;

}

1行なら「//」を行頭に付ける、複数行なら「/* */」で囲む、というのが基本の手順になる。

「/* */」はネスト(入れ子)できない

C++のブロックコメントは入れ子にできない。「/*」で始まったコメントは、最初に現れた「*/」で終わってしまうからである。すでに「/* */」が含まれている範囲を、さらに大きな「/* */」で囲もうとすると意図通りにならない。

/*  ← 外側のコメント開始

    /* 内側 */  ← ここの「*/」でコメントが終わってしまう

    int y = 0;  // ← ここはコメントの外(実行される)

*/  ← 余った「*/」はコンパイルエラーになる

このように、最初の「*/」でコメントが閉じてしまい、残りの「*/」が宙に浮いてコンパイルエラーになる。「/* */」が含まれる範囲をまとめて無効化したいときは、次に説明する「#if 0 ~ #endif」を使うのが安全である。

「#if 0 ~ #endif」で大きな範囲を無効化する

プリプロセッサの条件指定「#if 0」と「#endif」で囲むと、その範囲のコードはコンパイル対象から外れる。条件が「0(偽)」なので中身は常に無効化される、という仕組みである。

int main() {

#if 0

    /* この中の /* */ ごと、まとめて無効化できる */

    int a = 1;

    int b = 2;

#endif

    return 0;

}

「#if 0 ~ #endif」は「/* */」と違って入れ子にできるうえ、中に「/* */」が含まれていても問題なく無効化できる。あとで 01 に変えれば、囲った範囲をまとめて有効化できるのも利点である。広い範囲を一時的に切り離したいときに向く。

ドキュメントコメント(Doxygen など)

関数やクラスの説明から自動でドキュメントを生成するツール(Doxygen など)では、専用の書き方をしたドキュメントコメントを読み取る。文法上は通常のコメントなので、これらのツールを使わなくてもコンパイルには影響しない。

  • /// … 行コメント形式のドキュメントコメント。
  • /** … */ … ブロックコメント形式のドキュメントコメント。

/// 2つの整数を足して返す

/// @param a 1つ目の値

/// @param b 2つ目の値

int add(int a, int b) { return a + b; }

 

/**

 * 2つの整数を掛けて返す

 * @param a 1つ目の値

 * @param b 2つ目の値

 */

int mul(int a, int b) { return a * b; }

はじめのうちは「こういう書き方のコメントがある」程度に知っておけば十分である。チーム開発でドキュメント生成を使う段階になったら、Doxygen の記法を改めて確認するとよい。

コメントアウトの落とし穴

注意したいポイント
  • 「/* */」はネストできない… 内側に「/* */」がある範囲を外側から囲むと、最初の「*/」でコメントが終わってしまう。広い範囲は「#if 0 ~ #endif」で囲む。
  • コメント内に「*/」を含めない… 文字列やURL(例: http://…)の中に「*/」があると、そこでコメントが閉じてしまう。
  • 行末のバックスラッシュ「\」に注意… 行コメント「//」の末尾に「\」があると、コメントが次の行まで続いてしまう。改行が打ち消され、次の行も巻き込んでコメントになる。
  • 「//」より前のコードは実行される… 行の途中に「//」を付けても、その前にあるコードは無効化されない。1行まるごと無効化したいなら行頭に「//」を置く。

// 行末のバックスラッシュで次の行までコメントになる例 \

int z = 100;  // ← この行もコメント扱いになってしまう(実行されない)

 

int w = 200;  // ここからは通常どおり実行される

よくある質問(FAQ)

Q. 「//」と「/* */」はどちらを使えばよいですか?
A. 1行のメモや行末の補足は「//」、複数行をまとめて消したいときは「/* */」が基本です。C++では「//」のほうが広く使われます。

Q. 「/* */」の中にもう一つ「/* */」を書けますか?
A. 書けません。C++のブロックコメントは入れ子(ネスト)にできず、最初に現れた「*/」でコメントが終わります。内側に「/* */」がある範囲をまとめて無効化したいときは「#if 0 ~ #endif」を使ってください。

Q. コメントに日本語を書いても大丈夫ですか?
A. コメントはコンパイラに無視されるので、日本語で説明を書いても動作には影響しません。ソースコードの文字コードは UTF-8 など環境に合わせておくと安全です。

Q. コメントアウトしたコードはプログラムに残りますか?
A. ソースファイル上には文字として残りますが、コンパイル時に無視されるため実行ファイルには影響しません。不要になったコードは、最終的には削除して整理するのが望ましいです。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. コメントアウト
  2. 文字列の結合/連結
  3. 変数の宣言
  4. 定数の宣言
  5. if文
  6. if文の論理演算子
  7. for文
  8. データ型(文字列以外)
  9. データ型(文字列)
  10. 配列とfor文
  11. 配列の要素数
  12. 多次元配列とfor文
  13. 多次元配列の要素数
  14. 関数の定義と呼び出し

最近更新/作成されたページ