1

LOG4CPLUS の使用を簡素化するマクロを作成しようとしています。しかし、マクロを書くときに問題が発生しました。

これは私のcppファイルにあるものです:

Logger logger = Logger::getInstance("ManagerServer");

その後、次のような 1 行をログに記録できます。

LOG4CPLUS_ERROR(logger, logEvent);

logEvent を変数引数に変更できるよりも、マクロを書きたいだけです。そして、このように使用します:

LogErr("failed");
LogErr("failed times %d", iTimes);

だから、私はこのように書きます:

#define LogErr(fmt, args...)\
    do {\
        char szBuf[MAX_LOG_BUFFER_SIZE];\
        memset(szBuf, 0, MAX_LOG_BUFFER_SIZE);  \
        vsnprintf(szBuf, MAX_LOG_BUFFER_SIZE, fmt, ##args); \
        LOG4CPLUS_ERROR(logger, szBuf);\
    } while(0)

しかし、私がコンパイルするとき。g++ で次のメッセージが表示されます。

エラー: ')' トークンの前にプライマリ式が必要です

誰でも私を助けることができますか?ほんとうにありがとう。

4

4 に答える 4

2

おっと… Cタグが外されました

問題は、十分なパラメーターが指定されていない場合のマクロの展開にあります ( LogErr("failed"))。それはCでは機能しません。

ダミーパラメータを追加してみてください

LogErr("failed", 0);
/* or better */
LogErr("%s", "failed");

またv*、しようとしているように、マクロ内で関数を使用することはできません。プリプロセッサは、変数の引数について認識していないため、 type のオブジェクトを作成できませんva_list


C99 では、やろうとしているように見えることを行う 1 つの方法は、

#include <stdio.h>
#include <string.h>

#define MAX_LOG_BUFFER_SIZE 100

#define LogErr(fmt, ...)                                      \
  do {                                                        \
    char szBuf[MAX_LOG_BUFFER_SIZE];                          \
    memset(szBuf, 0, MAX_LOG_BUFFER_SIZE);                    \
    snprintf(szBuf, MAX_LOG_BUFFER_SIZE, fmt, ##__VA_ARGS__); \
    /* LOG4CPLUS_ERROR(logger, szBuf); */                     \
  } while(0)

int main(void) {
  LogErr("err %d", 4);
  /*LogErr("failed");*/
  LogErr("%s", "failed");
  return 0;
}

注:snprintf##__VA_ARGS

于 2011-06-25T13:48:23.417 に答える
1

You're missing a comma after the args parameter.

#define LogErr(fmt, args, ...)\
                        ^

Also, I don't know if g++ currently supports variadic macros, it's a C++11 feature. (I believe the C compiler supports them, though).

于 2011-06-25T13:46:21.470 に答える
1

pmg、Ferruccio、そして皆さんに感謝します。あなたたちは本当に私を救ってくれました!

これらのコードは、私の PC でうまく動作します。vsnprintf と snprintf を見逃したようです。

#define Log(fmt, args...) \
    do {\
        char szBuf[MAX_LOG_BUFFER_SIZE];\
        snprintf(szBuf, MAX_LOG_BUFFER_SIZE-1, fmt, ##args);\
        LOG4CPLUS_ERROR(logger, szBuf);\
    } while(0)

int main() {
    Log("Hello macro.");
    Log("Hello macro %d", 1);
    Log("Hello macro %s, %d", "foo", 2);

    return 0;
}

再度、感謝します!

于 2011-06-25T16:06:14.633 に答える
0

Log4cplus の最近の (1.1.0+) バージョンは、printf スタイルのマクロを使用したロギングをサポートしています。OPの例は次のようになります。

LOG4CPLUS_ERROR_FMT(logger, "failed");
LOG4CPLUS_ERROR_FMT(logger, "failed times %d", iTimes);

それでも別の方法で再実装したい場合は、実装の詳細についてloggingmacros.hを参照してください。

于 2012-09-20T13:24:18.217 に答える