例如,typedef
ngx_core.h
个typedef 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语言编程时这是一种很好的做法吗?而且,这种做法的名称是什么?为什么好或坏?
答案 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
的动机,有时也称为类型别名。
一个好处是源代码可以更清晰,因为冗余信息不会使代码混乱。不利的是,别名隐藏了它的类型(struct
,union
,enum
或其他类型。)
请注意,POSIX保留了类型名称的_t
后缀,因此从技术上讲,这违反了POSIX标准。