首先自动化生成无参函数与有参函数:

#define _syscall0(type,name) \  /*生成无参函数*/
type name(void) { long __res; __asm__ volatile ("int $0x80" 	: "=a" (__res) 	: "0" (__NR_##name)); if (__res >= 0) 	return (type) __res; errno = -__res; return -1; }

#define _syscall1(type,name,atype,a) \ /*生成带有一个参数的函数*/
type name(atype a) { long __res; __asm__ volatile ("int $0x80" 	: "=a" (__res) 	: "0" (__NR_##name),"b" ((long)(a))); if (__res >= 0) 	return (type) __res; errno = -__res; return -1; }

本例子的代码来源于<unistd.h>,(unistd.h代表了unix standard,就是UNIX 标准文件。),本文的例子Linux0.11源码中。

这段代码很简单,但是很巧妙地使用了define,读者自行体会一下这个用法。然后自己动手。

下面是另一个:

#define LIST_ENTRY(type)  struct {struct type *le_next;/* next element */ struct type **le_prev;/* address of previous next element */	}
这是一段生成自定义双向链表结构的写法,很巧妙啊!!来源于<queue.h> 系统内核数据队列的头文件。本文采用的是freeBSD4.4版本的代码。

当然很多人会不禁说:为什么不用模板啊?

答:模板属于C++的东西 ,从编译的角度来讲,C编译的东西执行更接近汇编语言,对于一个操作系统来说,运行速度就是一切!当然有人会说这样写不容易做大型开发,我只想说一句话“你都知道的事情,Linux内核设计者不知道吗?”,设计者们之所以这样写,肯定是有自己的考虑的。至于为什么,本人猜测就是设计者们自己用严禁的态度防止出错,同时提高效率。