ブロックコメントのトグル・テクニック
ブロックコメント(複数行コメント)の開始コメントをインラインコメント(単一行コメント)でコメントアウトすることによって、ブロックコメント自体を無効化するテクニックです。
ブロックコメント有効
/*
int a = 9;
printf("%d", a);
// */
ブロックコメント無効
// /*
int a = 9;
printf("%d", a);
// */
両者の切り替えはテキストエディタのショートカットキーで行えます(Windows: Control + /
, Mac: Command + /
)。
// /*
の代わりに//*
を用いる方法もあります。この場合はBack Space
キーと/
キーでトグルします。
複数処理のトグル・テクニック
複数のブロックコメントを切り替えるテクニックもあります。
ブロック A 有効
// /*
void p() { puts("a"); } /// A ///
/*/
void p() { puts("b"); } /// B ///
// */
ブロック B 有効
/*
void p() { puts("a"); } /// A ///
/*/
void p() { puts("b"); } /// B ///
// */
その他のイディオムとコメント修飾技法
目次
インラインコメント編
ドキュメントコメント
スラッシュを3つ並べる今流行りの記法です。通常のコメントと区別することができます。
// インライン・コメント
/// ドキュメント・コメント
使用例
int main() {
//printf("Shop 99");
printf("Hello world");
/// 成功時
return 0;
}
強調テクニック
コメントの末尾をコメントで閉じるようにすると、コメントが強調されて目に付きやすくなります。重要なコメントに対して使うと良いです。
// 強調・コメント //
int that() {
// 初期化 //
int a = 9;
// 後処理 //
return a; /// 必ず0以外の値を返すこと ///
}
トグルテクニック
一文字目を削除するとコメントが解除されます。
//**/ print("デバッグ")
↓
/**/ print("デバッグ")
テキストエディタのコメント・トグル機能が使えないような環境(Windowsのメモ帳.exeやLinuxのnanoエディタ等)で活用すると良いでしょう。
コード整列テクニック
コメントの内容を同一ブロック内のコードと揃えるテクニックです。コメントアウト時のコメント開始位置を行の先頭から記述することでこれを実現します。
class Clazz { /* まるで生きているかのような新鮮なコメント */
int a;
// int b;
int f() {
print(a);
// print(b);
}
}
元コードに溶け込んだコメントとなります。自然すぎて逆に違和感を感じるかもしれませんが、比較的効果的なイディオムとなります。シンタックスハイライトが効かない環境では逆に読みづらくなる場合があるため注意が必要です。
ブロックコメント編
強調
/* ブロック・コメント */
/** ドキュメント・ブロックコメント */
おしゃれ
/*/ 初期化 /*/
int i = 99;
/*/ 表示
/*/
print("hello");
ブロックコメントの先頭行を活用
/* 問い合わせ処理
* @param 最大検索数
* @return失敗時にnullを返す。
*/
もったいないので使っちゃいましょう。行数も削減できます。
矯正インデント
コード整形機能によってインデントの位置がずれてしまう問題を回避します。
Constraint defaultConstraint = cond
/**/ ? ConstraintTop
/**/ : ConstraintBottom;
return forward ? window->selectNext()
/**/ : window->selectPrev();
constructor(string str, size_t len)
/**/ : string(str)
/**/ , length(len) {}
ログ関数やアサーション関数の存在感を弱める効果もあります。
void fu(string str, size_t len) {
/**/assert(str != NULL);
/**/assert(len >= 0);
initialize();
setup(str, len);
}
コードを揃える用途としても活用できます。
const String a = "A";
/* */ String b = "B";
プリプロセッサ・特殊構文編
ジャンプテクニック
開始括弧と終了括弧が存在しない特殊な文法を利用している際に// {
と// }
という形で仮想的なブロック文を表現します。
#define NAMESPACE_AB_BEGIN(a, b) namespace a { namespace b {
#define NAMESPACE_AB_END(a, b) }}
NAMESPACE_AB_BEGIN(jp, marycore) // { ← ダブルクリック!
...
100行ほど
...
NAMESPACE_AB_END(jp, marycore) // }
テキストエディタによっては{
をダブルクリックすると終わり括弧}
にカーソルが移動したり、選択範囲が広がったりするすることがありますが、本ハックはその機能を活用するためのものです。
プリプロセッサによるコメントアウト
プリプロセッサを活用してコードを非活性化することもできます。
#if 0
puts("hello"); // 実行されない
#endif
バックスラッシュによるコメントアウト
C言語では、行末に記述されたバックスラッシュと改行文字は無視されます。これにより事実上のコメントアウトを実現することもできます。
//\
puts("hello"); // 実行されない
↓
//puts("hello"); // コンパイラ側ではこのように解釈される
短絡評価によるコメントアウト
論理AND演算子や論理OR演算子の短絡評価を活用することもできます。
false && puts("hello"); // 実行されない
true && puts("hello"); // 実行される
true || puts("hello"); // 実行されない
false || puts("hello"); // 実行される
論理AND演算子には、左辺の結果が真の結果だった場合にのみ右辺側の式が評価されるという性質があります。論理OR演算子の場合は左辺が偽の場合にのみ右辺が評価されます。
false式によるコメントアウト
if文の条件が常に偽となるような式を記述することで、then節のコメントアウトを実現することもできます。
if (false) {
puts("hello"); // 実行されない
}
// if (false)
{
puts("hello"); // 実行される
}
条件式に!
や1
を付加することでコメント状態のトグルを実現することもできます。
if ( 0) puts(""); // 実行されない
if (!0) puts(""); // 実行される
if (10) puts(""); // 実行される
if (!true) puts(""); // 実行されない
プロジェクトで稀に見かけるif (true)
やif (false)
という記述は、おそらくこれらのテクニックが利用された痕跡である可能性があります。
未到達コードに対する警告を回避したい場合には条件式を丸括弧で二重に書き込む必要があります。
if (0) puts("hello"); // 警告: Code will never be executed
if ((0)) puts("hello"); // 警告が発生しない
if (/* DISABLES CODE */ (0)) puts("hello"); // より明確な記述
false式によるコメントアウト・イディオムの利点や有効性については以下の記事の説明が参考になります。
参考:波括弧の省略テクニック集 #if false コメントアウト・イディオム