宏中的宏扩展

Macro expansion within a macro

本文关键字:扩展      更新时间:2023-10-16

我正在尝试创建 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 %ldn", 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++ 是否隐式尝试将宏参数转换为字符串?

如何解决?我的意思是,我正在使用 gnu LOG_MAKEPRI 宏进行系统日志记录,是这个宏可能会造成麻烦吗?另外,有没有办法查看宏扩展代码?

如何解决?

LOGDEBUG(("haystack_len %ldn", haystack_len));使用一个唯一参数调用宏。所以它将产生:

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

并且("haystack_len %ldn", haystack_len)使用逗号运算符并导致haystack_len

所以你必须这样称呼它:LOGDEBUG("haystack_len %ldn", haystack_len);

另外,有没有办法查看宏扩展代码?

gcc -E可能会有所帮助。