首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >宏中的宏展开

宏中的宏展开
EN

Stack Overflow用户
提问于 2014-02-18 11:11:58
回答 1查看 271关注 0票数 0

我正在尝试创建LOGDEBUG宏:

代码语言:javascript
复制
#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++显然试图对它们进行字符串化:

代码语言:javascript
复制
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宏进行系统记录,是这个宏可能造成麻烦吗?还有,有什么方法可以看到宏展开的代码吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-18 11:21:50

怎么解决这个问题?

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

代码语言:javascript
复制
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可能会有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21851988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档