+ -
当前位置:首页 → 问答吧 → 【内核】为什么要在结构体定义里用#define?

【内核】为什么要在结构体定义里用#define?

时间:2008-11-21

来源:互联网

在kernel很多地方都可以看到#define宏用在结构体的定义里,随便举一个例子:
  1. struct ipq {
  2.         struct ipq        *next;                /* linked list pointers                        */
  3.         struct list_head lru_list;        /* lru list member                         */
  4.         u32                user;
  5.         u32                saddr;
  6.         u32                daddr;
  7.         u16                id;
  8.         u8                protocol;
  9.         u8                last_in;
  10. #define COMPLETE                4
  11. #define FIRST_IN                2
  12. #define LAST_IN                        1

  13.         struct sk_buff        *fragments;        /* linked list of received fragments        */
  14.         int                len;                /* total length of original datagram        */
  15.         int                meat;  
  16.         spinlock_t        lock;
  17.         atomic_t        refcnt;
  18.         struct timer_list timer;        /* when will this queue expire?                */
  19.         struct ipq        **pprev;
  20.         int                iif;
  21.         struct timeval        stamp;
  22. };
复制代码


为什么不在结构体外面用#define宏呢?不知道这是基于什么考虑?
谢谢!

作者: new_learner   发布时间: 2008-11-21

感觉主要是用在这个结构里面的,所以定义到里面了。
个人猜测,呵呵。

作者: Godbach   发布时间: 2008-11-21

同意2楼上的,宏定义也是有可见域的,定义在结构题里面,可见域只能是这个结构体,也就是只能在这个结构体里面使用

作者: chenbdchenbd   发布时间: 2008-11-22

多谢LS两位答复
不过你们可以写个小程序实验一下,你们的说法是不成立的

作者: new_learner   发布时间: 2008-11-22

内核主要考虑到代码容易阅读,不然定义一个结构成员,很难理解是什么意思

作者: sxw35035   发布时间: 2008-11-22

二楼没错,三楼瞎扯,四楼有实践精神。
回去都好好看看啥叫预处理。

作者: mjdcl   发布时间: 2008-11-22



QUOTE:
原帖由 mjdcl 于 2008-11-22 12:16 发表
二楼没错,三楼瞎扯,四楼有实践精神。
回去都好好看看啥叫预处理。



呵呵。之前C版有人问过这个问题,当时测试的情况确实是在程序里都能使用这个宏。
可能就是形式上让这个宏的用处更明确一些吧。

作者: Godbach   发布时间: 2008-11-22

在内核代码里,还有一些驱动里面很经常见到,也一直没仔细去想过这个问题。

作者: eveson   发布时间: 2008-11-22

恩,期待更权威的答案

作者: Godbach   发布时间: 2008-11-22



QUOTE:
原帖由 Godbach 于 2008-11-22 13:29 发表


呵呵。之前C版有人问过这个问题,当时测试的情况确实是在程序里都能使用这个宏。
可能就是形式上让这个宏的用处更明确一些吧。



请教一下,如果我想搜索某个帖子,只能通过搜索标题的方法来吗?有些内容并没有把关键字放到主题里,所以感觉找这些东西有点难受。。。

CU里能不能通过搜索帖子内容的方法来找我感兴趣的帖子呢?

作者: new_learner   发布时间: 2008-11-22



QUOTE:
原帖由 new_learner 于 2008-11-22 17:11 发表


请教一下,如果我想搜索某个帖子,只能通过搜索标题的方法来吗?有些内容并没有把关键字放到主题里,所以感觉找这些东西有点难受。。。

CU里能不能通过搜索帖子内容的方法来找我感兴趣的帖子呢?



呵呵,这个好像是没有吧。不过觉得如果LZ直接在google里面搜索,只要CU里面有的,估计CU的结果会比较考前的

作者: Godbach   发布时间: 2008-11-22

实践了一下,确认是结构体外面也可以使用,看来对预处理还是理解不够。学习了

作者: chenbdchenbd   发布时间: 2008-11-23

/* Description of data base entry for a single host.  */
struct hostent
{
  char *h_name;                 /* Official name of host.  */
  char **h_aliases;             /* Alias list.  */
  int h_addrtype;               /* Host address type.  */
  int h_length;                 /* Length of address.  */
  char **h_addr_list;           /* List of addresses from name server.  */
#define h_addr  h_addr_list[0]  /* Address, for backward compatibility.  */
};
这个你们去试一下,在结构体外也能用,你就神了!

作者: hady55566   发布时间: 2010-09-08

热门下载

更多