我有以下情况:

#define DBG_ALOGD(a)   ALOGD("%s:%d: ", __FUNCTION__, __LINE__); ALOGD a
#define DBG_MSG(a)    do { if (debuggable) {DBG_ALOGD(a);} } while (0)


应用程序使用DBG_MSG(a)来打印日志。

DBG_MSG("Hi %d", 2);
将打印为

LOG_TAG: function_name:121
LOG_TAG: Hi 2


我想将FUNCTION:LINE与“ Hi 2”结合在一行中。

我试过了

#define DBG_ALOGD(a)   ALOGD("%s:%d:%s", __FUNCTION__, __LINE__, a)
#define DBG_MSG(a)    do { if (debuggable) {DBG_ALOGD(a);} } while (0)


它没有用,因为它不是普通字符串,也有%d
请提出如何更改#define使其具有这些特征的组合。

最佳答案

我认为您可以使用宏变量参数(variadics):

#include <stdio.h>

#define DBG_ALOGD(fmt, ...)   ALOGD("%s:%d: " fmt, __FUNCTION__, __LINE__, __VA_ARGS__ );
#define DBG_MSG(fmt, ...)    do { if (debuggable ) {DBG_ALOGD(fmt, __VA_ARGS__ );} } while (0)

int main(void)
{
    int debuggable = 1;
    DBG_MSG("%s(%d)\n", "test", 0);
    DBG_MSG("%s", "hello");

    return 0;
}


我用printf函数而不是ALOGD测试了它,但是我认为结果将是相同的。

警告,您将无法直接调用DBG_MSG("simple string"),因为编译器将等待...中不为空的内容

关于android - 嵌套的ALOGD语句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48740108/

10-11 21:17