为什么typedef在nginx中如此广泛使用?

时间:2013-09-03 16:36:29

标签: c nginx typedef

例如,typedef

中的大量结构有ngx_core.htypedef struct ngx_module_s ngx_module_t; typedef struct ngx_conf_s ngx_conf_t; typedef struct ngx_cycle_s ngx_cycle_t; typedef struct ngx_pool_s ngx_pool_t; typedef struct ngx_chain_s ngx_chain_t; typedef struct ngx_log_s ngx_log_t; typedef struct ngx_array_s ngx_array_t; typedef struct ngx_open_file_s ngx_open_file_t; typedef struct ngx_command_s ngx_command_t; typedef struct ngx_file_s ngx_file_t; typedef struct ngx_event_s ngx_event_t; typedef struct ngx_event_aio_s ngx_event_aio_t; typedef struct ngx_connection_s ngx_connection_t;
ngx_module_s

事实上,我知道typedef这样的结构名称可以使用,为什么ngx_module_t可以使用{{1}}?这是好设计吗?而且,这样做有什么好处?

使用C语言编程时这是一种很好的做法吗?而且,这种做法的名称是什么?为什么好或坏?

3 个答案:

答案 0 :(得分:3)

这是一种常见的做法。每次声明变量时都没有使用struct关键字。

答案 1 :(得分:3)

看看其中一个,定义为:

struct ngx_command_s {
  ngx_str_t             name;
  ngx_uint_t            type;
  char               *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
  ngx_uint_t            conf;
  ngx_uint_t            offset;
  void                 *post;
 };

您可以按如下方式使用ngx_command_s

struct ngx_command_s *x;
x = malloc(sizeof(struct ngx_command_s));

但是当您typedef时,您可以避开struct关键字:

typedef struct ngx_command_s ngx_command_t;

ngx_command_t *x;
x = malloc(sizeof(ngx_command_t));
  

为什么好或坏?

有些人认为结构typedef是不必要的,令人困惑,take a look

答案 2 :(得分:0)

在C语言中,与C ++不同,您不能直接通过名称引用struct标记,struct必须始终伴随它。这是使用typedef的动机,有时也称为类型别名。

一个好处是源代码可以更清晰,因为冗余信息不会使代码混乱。不利的是,别名隐藏了它的类型(structunionenum或其他类型。)

请注意,POSIX保留了类型名称的_t后缀,因此从技术上讲,这违反了POSIX标准。