2017-05-04 3 views
0

"printf("マクロのメッセージは%d \ n "、MESSAGEです);"実行時にたとえば、実行時に引数10を指定すると、メッセージが出力されます。それが与えられていなければ、このメッセージは表示されません。可能でしょうか?実行時にDEBUGメッセージを有効にする

#include <stdio.h> 

#define MESSAGE 10 

int foo; 
void main(int argc, char *argv[]) 
{ 
     foo = atoi(argv[1]); 
     printf("foo is %d\n", foo); 

#if MESSAGE==foo 
     printf("macro MESSAGE is %d\n",MESSAGE); 
#endif 
} 
+0

'if'チェックの問題点は何ですか? –

+0

プリプロセッサはランタイム値を使用できません。 – BLUEPIXY

+0

あなたはコンパイル時を意味していました...それは別のボールゲームです。 –

答えて

3

我々は、マクロの定義が何であるかコンパイル時間に条件付き制御するプリプロセッサマクロに基づいて、マクロを定義することができます。

#if DEBUGGING 
#define debug(format, ...) fprintf(stderr, format, __VA_ARGS__) 
#else 
#define debug(format, ...)() 
#endif 

debugマクロ自体はGCC's manualに実際例であります。

それとも、我々は実行時にいくつかの変数の値をチェックし、同様の機能作ることができます:

#include <stdarg.h> 
#include <stdio.h> 
int debugging = 10; 
void debug(int msglevel, const char *fmt, ...) 
{ 
    if (debugging < msglevel) return; 
    va_list va; 
    va_start(va, fmt); 
    vfprintf(stderr, fmt, va); 
    va_end(va); 
} 
... 
debug(10, "Error: %s\n", "some explanation"); 

完全な機能は、それが簡単に冗長レベルよりも大きいの比較を行うことになります。もちろん、それを完全に無効にするために、関数をコンパイル時に別の定義にすることはできます。 varargsについては、va_arg(3) man pageを参照してください。

+0

@kkachu、ありがとうございます。それはかなりクールで働いています。 – Akaash

関連する問題