宏连接符#-优化日志调试


在 Android 的 Binder.c 中,对 CMD 命令码的调试输出,有:

fprintf(stderr,"%s:\n", cmd_name(cmd));

//========================================================================

const char *cmd_name(uint32_t cmd)
{
    switch(cmd) {
        NAME(BR_NOOP);
        NAME(BR_TRANSACTION_COMPLETE);
        NAME(BR_INCREFS);
        NAME(BR_ACQUIRE);
        NAME(BR_RELEASE);
        NAME(BR_DECREFS);
        NAME(BR_TRANSACTION);
        NAME(BR_REPLY);
        NAME(BR_FAILED_REPLY);
        NAME(BR_DEAD_REPLY);
        NAME(BR_DEAD_BINDER);
    default: return "???";
    }
}

#define NAME(n) case n: return #n

//========================================================================

可以看到,cmd_name() 函数返回 CMD 命令码对应的字符串;

其中,通过 NAME() 宏,使用“#”连接符,把 BR_NOOP 这样的宏名给连接成字符串;

最终,返回该字符串;

//========================================================================

例如:

#define NAME(n) #n

我们就可以把 n 这个名称,转换成字符串;

//========================================================================

如下是测试的例子:

#define NAME(n) #n

//========================================
//========================================
enum type
{
    AAA = 1,
    BBB,
    CCC
};
//========================================
//========================================
#define WWW 2
//========================================
//========================================
int www123 = 0;

//========================================
//========================================
void func_xxx(void)
{
    printf("hehe!\n");
}
//========================================
//========================================
class test
{
public:
    test(){};
};


//========================================
//========================================
int main(array<System::String ^> ^args)
{
    printf("1 = %s\n", NAME(AAA));
    printf("1 = %s\n", NAME(WWW));
    printf("1 = %s\n", NAME(www123));
    printf("1 = %s\n", NAME(func_xxx));
    printf("1 = %s\n", NAME(test));

    printf("hehe ...\n");
    getchar();
    return 0;
}

//========================================================================

输出的结构如下:

1 = AAA
1 = WWW
1 = www123
1 = func_xxx
1 = test
hehe ...

可以看到,无论是变量名,宏名,以及函数名,都可以返回其字符串名称;

只需要99元就可以投资自己,掌握Linux系统编程!主要传授《Linux C/C++程序设计》《Linux 系统编程》,主页有学习视频!
只需要99元就拥有全部课程和资料,让我们用技术改变自己,改变生活,改变世界!
视频可以百度搜索:韦凯峰Linux编程学堂
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值