トリッキーコードネット トップへ戻る   C/C++, Java, Perl, PHP, JavaScript, アルゴリズム, ショートコーディング, IOCCCコードの解説, 等々

サイト情報

トリッキーなコード

7行プログラミング

物凄いコード集

アルゴリズム

データ構造

C/C++な話題

コードサンプル

ツール/環境構築

開発ノウハウ 等

ネタ/ジョーク集

おススメ書籍/サイト

サイトTOP >> トリッキーなコード >> これは便利!デバッグ用printfマクロ (C言語)

これは便利!デバッグ用 printfマクロ (C言語)

C言語の前処理(pre-process)は、コンパイラ言語の特徴を活用した、とても便利な機能だと思います。

例えば、デバック時と本番運用時で、関数の中身やコードを書き換えたい場合などは、以下のようにします。
#define DEBUG

#ifdef DEBUG
 ~~ デバッグ用コード ~~
#else
 ~~ 本番用コード ~~
#endif
こうしておくことで、#define DEBUG を コメントアウト or コメントアウトを外すだけで、 本番用コードとデバッグ用コードを切り替えることができます。 ・・・って、はい、常識ですね♪ しかし、しかし、 プログラミングにデバッグ作業はつきもので、 デバッグ作業には、デバッグ用のコードが必要で、 デバッグ用コードと本番用コードを切り替える為に、 あちらこちらに #ifdef, #else, #endif を書きまくるのは、 何だかソースコードが汚らしく見えてしまい、非常にナンセンス ヽ(`Д´#)ノ ムキー!! ※余談ですが、スクリプト言語にはもちろん前処理機能がない為、コードを切り分けるには、 「コード中のif-elseで切り分ける」か、「あちらこちらにコメントアウトして回る」しか、方法がありません。 コメントアウトに関しても、(コンパイラ言語の様に)実行時に取り除かれるワケではない為、 その分 余計な負荷がマシンに掛からないか、とっても心配になります(← 小心者w)。 え~っと、前置きが長くなりましたが、 ここでとっておきのデバッグ用printfマクロをご紹介します。
#define DEBUG

#ifdef DEBUG
#define debug_printf printf
#else
#define debug_printf 1 ? (void) 0 : printf
#endif

Cコード例)

#include <stdio.h>

#define DEBUG

#ifdef DEBUG
#define debug_printf printf
#else
#define debug_printf 1 ? (void) 0 : printf
#endif

int main(void)
{
    int i = 3;
    debug_printf("%d", 3);

    return 0;
}
結果は、 DEBUGが定義されていたら、3が表示 DEBUGが定義されていたら、何も表示されません。 補足しておくと、DEBUGが定義されていないと、 debug_printf("%d", 3); ← の部分は 1 ? (void) 0 : printf("%d", 3); ← となります。 この時、絶対に実行されない printf("%d", 3); のコードは、 コンパイラの最適化機能により、コンパイル後の実行ファイルからは跡形もなく消え去っている! というわけです^^;) 冒頭の、「#ifdef-#else-#endif を使ってコードを切り分ける」王道の方法よりも、 幾分スマートにコードを切り分けられるのではないでしょうか?? ついでにおまけ:

printfだけではなく、任意の関数の有効/無効の切り替えマクロ

#ifdef DEBUG
#define debug
#else
#define debug 1 ? (void)0 :
#endif
使用例) debug hogehoge_func(); これも(・∀・)イイ! 早速使ってみようと思います~~。
         このエントリーをはてなブックマークに追加   


作業効率化・ライフハックのオススメ記事




コンピュータ・テクノロジーのオススメ記事





恋愛・人間関係のオススメ記事




※ 当サイトは、トップページからリンクで辿る事の出来るページに限り、リンクフリーです。
※ 当サイトの閲覧/利用によって生じた如何なる損害も、当サイト管理人は責任を負いません。
※ 当サイトの内容を転載される場合は、当サイトへのリンクをお願い致します。