doit:
一些关于宏的高级定义记录,
#include<stdio.h>
enum{
test0=0,
test1,
test2,
test3,
};
// 在宏定义中,使用 # 将参数转为字符串
#define TO_NAME_INDEX(X) #X,X
int main()
{
printf("zyy.....%s\r\n",TO_NAME_INDEX(test3));
}
out:
zyy@host-pc:~/zyy/$ ./main
zyy.....test3
#include <stdio.h>
#include <stdlib.h>
// 在宏定义中,使用 # 将参数转为字符串,使用 ## 来连接两个参数作为一个整体标识符。
#define STRING(x) #x
#define COMBINE(x, y) x##y
int main(int argc, char **argv)
{
int x1 = 1;
int x2 = 2;
// STRING(x1) 将变成 "x1"
// COMBINE(x, 1) 将变成 x1
printf(STRING(x1) " = %d\n", COMBINE(x, 1));
printf(STRING(x2) " = %d\n", COMBINE(x, 2));
return 0;
}
#include<stdio.h>
#define TO_NAME_INDEX(X) #X,X
enum{
test0=0,
test1,
test2,
test3,
testmax,
};
struct name_to_index {
char name [100];
unsigned int index;
};
static struct name_to_index device_name_index[testmax] = {
{TO_NAME_INDEX(test0)},
{TO_NAME_INDEX(test1)},
{TO_NAME_INDEX(test2)},
{TO_NAME_INDEX(test3)},
};
static int find_index(struct name_to_index * table, int len, const char * name) {
int ret = 0;
int i;
if(table == NULL || name == NULL)
{
ret = -1 ;
goto done;
}
for(i=0;i<len;i++){
const char *tn = table[i].name;
int len = strlen(tn);
if(strncmp(tn,name,len)==0){
if(strlen(name)!=len) continue;
ret = table[i].index;
goto done;
}
};
done:
return ret;
};
int main()
{
printf("zyy....%d...%s\r\n", find_index(device_name_index,testmax,"test2"),TO_NAME_INDEX(test3));
}