## :用在宏定义中将参数连接成字符串。
# :用在宏定义中将参数转换成字符串。
举例说明:
"##"的使用示例:
//1.定义如下的测试用例列表
test_definition test_list[] = {
ADD_TEST(step_type),
ADD_TEST(step_var),
ADD_TEST(step_typedef_type),
ADD_TEST(step_typedef_var),
ADD_TEST(vec_align_array),
ADD_TEST(vec_align_struct),
ADD_TEST(vec_align_packed_struct),
ADD_TEST(vec_align_struct_arr),
ADD_TEST(vec_align_packed_struct_arr),
};
//2.test_definition类型和ADD_TEST宏定义分别如下:
typedef struct test_definition
{
basefn func;
const char *name;
} test_definition;
#define ADD_TEST(fn) \
{ \
test_##fn, #fn \
}
//3.对于ADD_TEST(step_type),展开后得到:
{
test_step_type, "step_type"
}
正好就对应一个struct test_definition类型变量的初始化。
"#"的使用示例:
进一步拓展,在使用带参数宏定义函数的时候,##还有很多妙用,比如通过宏参数来改变定义函数的名字,通过宏参数来改变定义函数的入参类型等,看下面的例子:
1.通过宏参数来改变定义函数的名字
#define TEST_FUNC(a) \
void testfunc##a(void)\
{\
printf("test func");\
}
2.通过宏参数来改变定义函数的入参类型
#define TEST_FUNC(type,size) \
void testfunc(type##size *k)\
{\
printf("test func");
}
举个例子,TEST_FUNC(uint, 8);展开后得到
void testfunc(uint8 *k)
{
printf("test func");
}
最近做openctl cts移植的时候用到了,这里总结一下。