2011-07-27 9 views
0

私のプロジェクトにログインすることを実現したい。 私はだから私はこのマクロのためのインタフェースを実現したい、マクロ持っC C++プリプロセッサオーバーロードされたマクロのための異なる引数

__LOG_TRACE(lg, expr,...) LOG_TRACE_STREAM(lg) << expr; 

のようになめらか - 他のマクロを、私は2種類をサポートしたい:最初

LOG_TRACE(msg); 
LOG_TRACE(my_logger, msg); 

私はいくつかのグローバルロガーを持っており、マクロはグローバルロガーを使用してmsgと記述します。 2番目のマクロはmy_loggerになり、それを使用してmsgと書きます。

私はLOG_TRACE(msg, my_logger);で作ることができますが、それは良くありません。コードを読むのは難しいです。引数の順序は__LOG_TRACEである必要はありません。

更新: マクロのオーバーロードを意味するものではありません。 ルック - たとえば私はあなたがロガーの可変数を持っていない場合は今、私は

LOG_TRACE(msg); 
LOG_TRACE(msg, logger); 

を書くことができます。しかし、私はmsg,loggerlogger,msg

+0

正確な要件は何ですか? – iammilind

答えて

2

ない場合は、この

#define LOG_TRACE(...) __LOG_TRACE(__VA_ARGS__, current_active) 

を行うことができ、各ロガーのマクロを作成することをお勧めします。 ex(LOG_TRACE_XML、LOG_TRACE_OUT、LOG_TRACE_TXT)。よりシンプルな方が良いからです。

しかし、これを行うには良い方法はLOG_TRACE_ERROR/LOG_TRACE_WARNING/LOG_TRACE_INFOを持っており、これらのマクロは、IPCまたは別のマクロ(SET_MODE(XML/TXT/OUT))を使用して振る舞う方法を管理することです

+0

私は7つのロガーしか持っていませんが、問題は古いコードです。古いコードをたくさん使っています。ここではLOG_TRACE(msg);私は互換性を失うことができませんでした。 – Olympian

+0

多分、ソリューションはすべてを統一する層です。または、リファクタリングをコード化し、1つのロガーのみを保持します。とにかくそれは実装に大きく依存します。 – cprogrammer

1

プリプロセッサマクロをオーバーロードすることはできません。コンパイラはこれを過負荷ではなく再宣言とみなし、2番目のマクロのみが有効になります。

マクロを読みやすくするために、そしてそれがあなたが望む機能を得る唯一の方法であるために、マクロに異なる名前を付けるようにしてください。

+0

私はマクロのオーバーロードを意味しません - 私は__VA_ARGS__でいくつかの "ゲーム"をしたいです – Olympian

0

なぜ関数を作成して式マクロを文字列化しないのですか?

#define DO_AND_RETURN_STRING_EXPR(x) (x,#x) 

ov(DO_AND_RETURN_STRING_EXPR(y)) 
ov(my_logger, DO_AND_RETURN_STRING_EXPR(y)) 

(このコードはテストしていません)。

0

__VA_ARGS__は、現在のC++標準の拡張ですが、これを使用して遊ぶ場合は、P99にはあなたが望むものを達成するための多くのユーティリティマクロがあります。特に、呼び出される引数の数に応じて条件を実装するマクロ。

#define LOG_TRACE(...)     \ 
P99_IF_EQ_1(P99_NARG(__VA_ARGS__))  \ 
(LOG_TRACE_(my_logger, __VA_ARGS__))  \ 
(LOG_TRACE_(__VA_ARGS__)) 

P99は実際にはC++と互換性がないため、少しばかり適応させる必要があります。

ところで、_で始まり、大文字または別のアンダースコアで始まる識別子は、CおよびC++によって予約されています。ダブルアンダースコアは一般にC++では許可されていません。なぜなら、名前のマングリングを妨げる可能性があるからです。だから、あなたの基本マクロのために別の名前を選ぶほうがいいでしょう。

関連する問題