2009-10-04 22 views
13

私のプログラムはログとstdoutに書き込みます。ただし、すべてのメッセージに一定の優先順位があり、優先順位にはどの優先順位がどのストリーム(ログまたは標準出力)になるかをユーザーが指定します。ユーザの好みに応じてフィルタリングするラッパーprintf関数

unsigned short PRIO_HIGH = 0x0001; 
unsigned short PRIO_NORMAL = 0x0002; 
unsigned short PRIO_LOW = 0x0003; 

優先いくつかのフラグで処理される:

unsigned short PRIO_LOG = (PRIO_HIGH | PRIO_NORMAL); 
unsigned short PRIO_STD = (PRIO_HIGH); 

write_log関数はunsigned short priorityの追加パラメータを使用して、printf関数と同じパラメータで動作しなければなりません。私はしかし、見つけることができませんif(priority & PRIO_LOG)(戻り値> 1任意のフラグは両方の引数に設定されている場合)

write_log((PRIO_NORMAL|PRIO_LOW), "HELLO %s, take %d", "World", 1); 

PRIO_NORMAL|PRIO_LOWはほとんど意味がない場合でも、...)のフラグをチェック

が簡単です文字列リテラルをprintf関数の書式引数に渡す方法について説明します。誰でも助けてもらえますか(同じ効果を達成する別の方法に可能です)?大変感謝しています。代わりのprintfのあなたはまた、vprintfを(呼び出したい

答えて

33

)()thisの線に沿って何かを参照して、可変引数の詳細についてはC.

int write_log(int priority, const char *format, ...) 
{ 
    va_list args; 
    va_start(args, format); 

    if(priority & PRIO_LOG) 
      vprintf(format, args); 

    va_end(args); 
} 

の "varargs" 機能を使用して。

+0

Visual C++では、代わりに_____VA_ARGS_____を使用できます。リファレンス:http://msdn.microsoft.com/en-us/library/ms177415(v=vs.110).aspx –

+1

必要な '#include ' – robisrob

5

私は、Jeffのアイデアは道のりだと思っていますが、vprintfを使わずにマクロでこれを達成することもできます。これがどのように機能するかについての情報のため

#define write_log(priority,format,args...)  \ 
        if (priority & PRIO_LOG) {  \ 
         printf(format, ## args); \ 
        } 

チェックhere:これはGCCが必要な場合があります。 |

4
あなたはPRIO_ *定義はビットとして使用する場合は(使用および&)

は、あなたはそれらの一つ一つに独自のビットを与える必要があります:マクロが何を使用することによって改善することができる

unsigned short PRIO_HIGH = 0x0001; 
unsigned short PRIO_NORMAL = 0x0002; 
unsigned short PRIO_LOW = 0x0004; 
{} while(0)表記です。これは、write_logへの呼び出しを文のように機能させます。

+0

を表示するように編集してください。私はそれを私のソースの中では好きでした。指摘してくれてありがとう!鋭い目のために+1。 – wsd

関連する問題