2016-04-18 4 views
2

MACROを実装してプリント名を登録できますか?以下のように:MACRO名を特定の文字列として定義できますか?

1.C

O_PRINT_NAME_REGISTER(NET_TRACE) 
O_PRINT_NAME_REGISTER(MAIN_TRACE) 

void example(void) 
{ 
    NET_TRACE(" net log"); // LINE 20 
    MAIN_TRACE(" main log"); // LINE 21 
} 

予想される出力

例 - 20:ネットログ
例 - 21:メインログ

どのようにO_PRINT_NAME_REGISTER()を定義しますか?

+0

NET_TRACE/MAIN_TRACEはMACRO NAMEであると予想されます。 –

+0

私はあなたがこれを行うことができるとは思わない。行番号を知るためには、NET_TRACEはマクロでなければならないが、マクロはマクロを作成することができない。 –

+0

あなたの要件は私にとって混乱しているようです。トレースと行番号を出力するマクロが必要ですか? – Pushpendra

答えて

0

別のマクロからマクロを定義することはできません。

得られた完全にマクロ置き換え前処理トークンシーケンス は、それがいずれかのような場合でも、前処理指令として処理されていない、

:C99 6.10.3.4/3「再スキャンさらに置換」からマクロを使用して関数を準備することは可能ですが、ではなく、の行番号と関数名の情報を取得します。例えば

#define O_PRINT_NAME_REGISTER(FN_NAME) static void FN_NAME(char *arg) { \ 
              printf("%s\n", arg);   \ 
             } 

ideone link


かわりに適切な関数に関数名と行番号情報を引数として NET_TRACEようなマクロをとり、通過マクロを定義するか、渡すことができ

適切なロギング関数は、関数名と行番号情報を処理できる汎用関数へのポインタです。

+2

私はこれが関数ポインタを使う絶好の機会だと思います。 – RastaJedi

+0

@ RastaJedi、どうですか?詳細の提供を手伝ってもらえますか? –

関連する問題