我正在尝试创建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_len
为size_t
,我不会将其转换为宏中的char*
,但编译器会将其视为{{1}}。 g ++是否隐式尝试将宏参数转换为字符串?
如何解决这个问题?我的意思是,我正在使用gnu LOG_MAKEPRI宏进行syslogging,这个宏可能会造成麻烦吗?另外,有没有办法看到宏扩展代码?
答案 0 :(得分:1)
如何解决这个问题?
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
可能有帮助。