2

私はロギングメカニズムを使用するアプリケーションを開発しており、さまざまな数の引数を取り、特定のメッセージをログに出力する一種の printf 関数を実装しました。この関数に関数名を追加したいのですが、何を書くべきかわかりません各関数呼び出しでこの引数。

だから私はマクロを書くことにしましたが、それはそれほど簡単ではないことがわかりました

#define WriteToLogParams(szMessage, nLogLevel, param1, param2) WriteToLogParamsFunc(szMessage, __FUNCDNAME__, nLogLevel, param1, param2)

最初に、ある種のマクロのオーバーロードがあり、簡単に実行できると思いましたが、同じ名前で引数の数が異なる別のマクロを作成すると、コンパイルされないことがわかりました。したがって、それを機能させるには、各マクロ名を一意にする必要があります。

これを行うためのインテリジェントな方法はありますか?

よろしくお願いします。

4

2 に答える 2

3

__VA_ARGS__マクロが使える

例えば:

WriteToLogParamsFunc(const char *__file, int __line, const char* __func, int nLogLevel, const char *szMessage, ...);

#define WriteToLogParams(nLogLevel, szMessage, ...) WriteToLogParamsFunc(__FILE__, __LINE__, __FUNCTION__, nLogLevel, szMessage, __VA_ARGS__ )
于 2012-10-10T11:26:49.463 に答える
2

可変引数マクロをサポートするプリプロセッサがいくつかあると思いますが、それが標準であるかどうかはわかりません。また、それをサポートしていないコンパイラが確実に存在するため、移植性がありません。

ただし、可変数のパラメーターを使用する代わりに、パラメーターを 1 つだけ使用してください。これは私がやったことです:-

#define WriteToLogParams(args) WriteToLogParamsObject::Instance (__FUNCDNAME__) << args

ここで、WriteToLogParamsObject は、静的メンバーによって作成され、Instanceオーバーロードされたストリーミング オペレーターを持つクラスです。これにより、ストリーミング オーバーロードをクラスに入れるなど、これらの演算子を使用する利点が得られます。

class SomeClass
{
   static friend WriteToLogParamsObject &operator << (WriteToLogParamsObject &stream, const SomeClass &item_to_log)
   {
     stream << "member1 = " << item_to_log.m_member1 << ", member2 = " << item_to_log.m_member2;
     // and so on (syntax might be off)
     return stream;
   }
 };

マクロを使用するには:-

WriteToLogParams ("some message " << some_value << " another bit of text " << another_value << " and so on");
于 2012-10-10T11:26:35.877 に答える