+ -
当前位置:首页 → 问答吧 → 请教 include/linux/init.h中一句代码

请教 include/linux/init.h中一句代码

时间:2010-12-22

来源:互联网

#define   __setup(str, func)                         /* nothing */


定义成空操作是为什么?


大牛指教。

作者: VIP_fuck   发布时间: 2010-12-22

你注意下那是条件编译  这样在别的地方调用了他,不管怎么样都可以编译过了。

作者: amarant   发布时间: 2010-12-22

回复 amarant


    我知道可以编译通过

    我的问题是这么写的原因是什么?

    __setup()注册设备 但是定义成空的宏 原因是什么

作者: VIP_fuck   发布时间: 2010-12-22

你看一下定义这个宏的前面是不是有条件宏的判断语句。
通常来讲,应该应该会有判断的。

作者: Godbach   发布时间: 2010-12-22

回复 Godbach


    版主终于出手相救了

    代码大概是:

     86 #ifndef MODULE
.................
145 #define __setup(str, fn) \
146 __setup_param(str, fn, fn, 0)
.................
182 #else /* MODULE */
................
215 #define __setup(str, func) /* nothing */
216 #define __obsolete_setup(str) /* nothing */
217 #endif


不太明白为什么定义模块的话 __setup 就是空的宏

作者: VIP_fuck   发布时间: 2010-12-22

182 行很关键啊,你明白他的意思吗

作者: Godbach   发布时间: 2010-12-22

回复 Godbach


    不定义成模块的话 做下面的事情

     但是.....仅停留至此了 不知道这么做的意义

作者: VIP_fuck   发布时间: 2010-12-22

刚刚开始读网络内核源码 很多东西都理解不上去

作者: VIP_fuck   发布时间: 2010-12-22

个人的理解,就是这两个宏使用在非模块的代码中。当你的以模块的形式编译时,应该是用不上这两个宏的。

作者: Godbach   发布时间: 2010-12-22

回复 VIP_fuck


    #ifdef
    #else
    #endif

    这就是关键,具体怎么样我也没读过这个代码。。

作者: amarant   发布时间: 2010-12-22

条件编译语法阿,这个倒是很好理解,不过内核里面有很多这样写的,理解起来就不是很容易了

作者: rubylc_unix   发布时间: 2010-12-22

回复 rubylc_unix


    确实是 呵呵
   
    对于这里理解还不够 所以只是停留在语法层次上稍微下一点

作者: VIP_fuck   发布时间: 2010-12-22

现在搞明白了么

作者: Godbach   发布时间: 2010-12-22