1. 遇到问题
之前做项目时候遇到一个问题,比如说一个流程中有很多个step,这些我用一个enum来定义,比如:
enum ACTION
{
ACTION_cali = 0, //标定
ACTION_meas, //测量
...
}
这时候,在跑到每个步骤开始的时候,我都会把当前步骤的名称打印出来
比如
printf("Cur action - %d\r\n",ACTION_jiaoban);
但是这时候,我们打印出来的都是类似:
Cur action - 1
Cur action - 2
这种,
直接阅读log,其实比较不直观。
2. 笨方法
之前为了解决这个问题,专门写了一个根据enum值映射string的函数
实现这样的转换:
str[ACTION_cali ] = "ACTION_cali "
然后打印
printf("Cur action - %s\r\n",str[ACTION_cali ]);
这样造成的不方便就在于,一旦enum的结构体增加了减少了调整顺序了,这个映射关系都要修改。
3. 新方法,使用#来实现宏替换
如果我们用 # 来实现宏替换。
#define PRINT_ENUM_STEP(action) printf(“Cur action - #action (%d)\r\n”,action);
这样,我们直接调用
PRINT_ENUM_STEP(ACTION_cali )
就可以打出
Cur action - ACTION_cali (0)
的效果了。
4. 感触
除了#来实现宏替换,## 还可以实现字符串的粘贴,简单地写一个测试程序。
#include <stdlib.h>
#include <stdio.h>
#define TEST1(x) printf("%d\r\n",Para##1);
#define TEST2(x) printf(" The para is #x \r\n");
#define TEST3(x) printf(" The para is "#x" \r\n");
#define TEST4(x) printf(" The para is %s \r\n",#x);
int main()
{
int Para1 = 1;
int Para2 = 2;
TEST1(1);
TEST1(2);
TEST2(2);
TEST3(2);
TEST4(2);
}