int init_module(void) __attribute__((alias(#initfn)));
module_init宏的关键点是在代码中的第4行,通过gcc别名的特性将init_module与initfn等同起来。这里宏定义的技巧出现在第2和3行,通过return initfn实际上是来对initfn做静态类型检查,以确保程序员不会提供一个原型不符合要求的模块初始化函数,后者要求是一个参数值为void,返回者为int类型的函数。所以,如果你定义了一个比如void my_module_init(void)或者是void my_module_init(int)这样的模块初始化函数作为module_init宏参数,那么编译时就会出现类似下面的warning: GPIO/fsl-gpio.c: In function '__inittest':
GPIO/fsl-gpio.c:46: warning: return from incompatible pointer type
2. 变长参数列表,比如系统调用相关的定义:
点击(此处)折叠或打开
#define __SYSCALL_DEFINEx(x, name,...)\
asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__))