0

LOGDEBUG マクロを作成しようとしています:

#ifdef DEBUG
#define DEBUG_TEST 1
#else
#define DEBUG_TEST 0
#endif

#define LOGDEBUG(...) do { if (DEBUG_TEST) syslog(LOG_MAKEPRI(LOG_SYSLOG, LOG_DEBUG),  __VA_ARGS__); } while (0)

...

size_t haystack_len = fminl(max_haystack_len, strlen(haystack_start));
LOGDEBUG(("haystack_len %ld\n", haystack_len));

引数を文字列化するために # または ## パラメーターを使用していませんが、g++ は明らかにそれらを文字列化しようとします。

numexpr/interpreter.cpp:534:5: error: invalid conversion from ‘size_t {aka long unsigned int}’ to ‘const char*’ [-fpermissive]

であることに注意してください。マクロでhaystack_lensize_t変換しませんがchar*、コンパイラはそれをそのように認識します。g++ は暗黙的にマクロ引数を文字列に変換しようとしますか?

それを修正する方法は?つまり、syslog に gnu LOG_MAKEPRI マクロを使用しているのですが、このマクロが問題を引き起こしているのでしょうか? また、マクロ展開されたコードを見る方法はありますか?

4

1 に答える 1

1

それを修正する方法は?

LOGDEBUG(("haystack_len %ld\n", haystack_len));一意の引数を 1 つ指定してマクロを呼び出します。したがって、次のものが生成されます。

do { if (DEBUG_TEST) syslog(LOG_MAKEPRI(LOG_SYSLOG, LOG_DEBUG), ("haystack_len %ld\n", haystack_len)); } while (0);

("haystack_len %ld\n", haystack_len)コンマ演算子を使用すると、次のようになりますhaystack_len

したがって、次のように呼び出す必要があります。LOGDEBUG("haystack_len %ld\n", haystack_len);

また、マクロ展開されたコードを見る方法はありますか?

gcc -E役立つかもしれません。

于 2014-02-18T11:21:50.940 に答える