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

如何解决?我的意思是,我正在使用gnu LOG_MAKEPRI宏进行系统日志记录,这是否可能会引起麻烦?另外,有什么办法可以看到宏扩展代码?

最佳答案

如何解决?


LOGDEBUG(("haystack_len %ld\n", haystack_len));用一个唯一的参数调用宏。
因此它将产生:

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可能有帮助。

关于c++ - 宏内的宏扩展,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21851988/

10-11 20:54