はじめに
C++書いてますか?
私は最近になってUnreal Engineを勉強することになったので、C++も書き始めるようになりました。
そして、Unreal C++の勉強でUnreal公式の動画を見ていた時に、コードにコメントを書く時の形式が違っていたのが気になり、C++でのコメント/コメントアウトの書き方を色々調べたのが今回の記事のきっかけになります。
「コメント」と「コメントアウト」の違い
これ調べるまで勘違いしてたのですが、コメントとコメントアウトって全然違うんですね...
コメント
「ソースコード中にメモなどを記述するために、特別な構文等を使用して記述した、プログラムとして解釈されない文字列、またその内容」らしいです1
コメントアウト
「コメント構文を使用して、ソースコードをコメントに変え、一時的にプログラムを無効化すること」とのこと
てっきり、コメントを書くことをすべて「コメントアウト」というんだとずっと思ってましたが、ちゃんと区別がありました。
今回はC++での3種類の「コメントアウト」記法を紹介します。
コメントアウト記法① //
基本
まずは「コメント」でも良く使われている//
を使ったコメントアウト方法
int Main()
{
// int hoge = 0;
}
C++で追加されたコメントアウト記法です。
一行だけコメントアウトしたい場合などに使えますね。
複数行のコメントアウト
複数行のコメントアウトをしたい場合は//
を各行に記述しないといけません
int Main()
{
// int hoge = 0;
// for (int i = 0; i < 10; i++)
// {
// hoge += i;
// }
}
Visual Studioなどを使用していればコメントアウトしたい行を複数選択してCtrl
+K
した後にCtrl
+C
を押すとすべてコメントアウトしてくれます
コメントアウト記法② /**/
基本
一つ目の記法ではVisual Studioなど便利なIDEを使っていないと複数行のコメントアウトは面倒だったりします。
そんなときに便利なのが/*
と*/
で囲む方法ですね。
int Main()
{
/*
for (int i = 0; i < 10; i++)
{
hoge += i;
}
*/
}
複数行コメントを書く時にも使われたりします。
Visual Studioなどの機能を使わない人からしたら無駄にインデントをずらさないで済むので良かったりしますね。
ネスト構造のときの注意点
ただ、ネスト構造だとコメントアウトがうまくいかないことがあるので注意が必要です
int Main()
{
/*
for (int i = 0; i < 10; i++)
{
/* hoge += i; */
}
*/
}
ご覧の通り、もともとfor文内で/**/
でコメント化している部分があると正しく指定した範囲をコメント化できないという問題が起きます(今回の例ではMain()内の下2行がコメントアウトされていないのでエラーになる)。
コメントアウト記法③ #if 0
基本
最後は、Googleで「C++ コメントアウト」と調べても中々でてこない#if 0
を使う方法です。
int main()
{
#if 0
int hoge = 0;
for (int i = 0; i < 10; i++)
{
hoge += i;
}
#endif
}
正確にはこの記法はコメント機能ではなく条件コンパイルと呼ばれるものらしいです。
C言語経験者ほど活用するテクニックとのこと(ほんと?)。
複数行・ネスト構造に対応
#if 0
を使うと複数行のコメントアウトに対応しており、ネスト構造にも対応しています
int main()
{
#if 0
int hoge = 0;
for (int i = 0; i < 10; i++)
{
#if 0
hoge += i;
#endif
}
#endif
}
コメントアウトの切り替え
#if 0
を#if 1
に変えることでコメントアウトを切り替えることができます
int main()
{
#if 1
int hoge = 0;
for (int i = 0; i < 10; i++)
{
#if 0
hoge += i;
#endif
}
#endif
}
複数の実装案の切り替え
#if 0
はif文なのでelse
を使うこともできます。
int main()
{
int hoge = 0;
#if 0
for (int i = 0; i < 10; i++)
{
hoge += i;
}
#else
int count = 0;
while (count < 10)
{
hoge += count;
}
#endif
}
旧方式と新方式など複数の実装案を試したいときに切り替えが楽だったりします。
まとめ
C++でのコメントアウトする方法として3種類紹介しました
- 行の先頭に
//
を付ける -
/*
と*/
で囲む - 条件コンパイルの
#if 0
を使う
個人的には
- 「コメント」には
//
を使う。 - 「コメントアウト」には
#if 0
を使う
のがいいかなあと考えています。
#if 0
はコメントアウト以外で使われることはまずないので、コメントアウトの箇所を検索しやすいだろうなと。
また、大規模な開発だとコメントアウトする行数が膨大になったりするので、可読性の観点でも#if 0
がいいでしょうね。
皆さんも個人でもチームでもコメント化の方法は何かしら統一するといいでしょう
意味もなく記法がバラバラだととても気持ち悪いコードになってしまいますからね...
余談
ちなみに、自分が見たUnreal C++の動画(C++ Battery Collector)では/**
と*/
で囲んでコメントを書いていたのですが、/**
のように*
を1つ余分に付けているのには何か意味があるんですかね...?