在 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编程学堂