<pre name="code" class="plain">#include<stdio.h>
#include<malloc.h>
#define List(X) \
struct list_##X \
{\
X data;\
struct list_##X *next;\
}
typedef char * string;
int main()
{
List(int) l1={1,NULL};
List(double) l2={2,NULL};
char *p=(char *) malloc(10);
strncpy(p, "HELLO", 10);
List(string) l3={p, NULL};
printf("\n%d %f %s\n", l1.data, l2.data, l3.data);
free(p);
return 0;
}
struct list_##X \
{\
X data;\
struct list_##X *next;\
};
1.注意这里千万别加分号,加上去报错可以通过在预处理阶段找出原因gcc -E test.c
2.为什么加##,否则结构体冲重义了,这样我们就可以获得结构题struct list_int,struct list_double
3.typedef char * string;否则struct list_char*不是合法标志名
4.为什么宏中有\,因为宏是以行为单位表示结束的,用/表示宏替换在本行还没有结束