命名约定
NGINX 源代码中的命名规则应该始终使用完整名称,包括源码文件名(.c, .h)、全局变量、全局函数、C 结构体/联合/枚举、静态变量/函数以及 .h 头文件内的公共宏定义。这一点很重要,因为 C 没有像 C++ 中那样的显式名称空间的概念。使用完整名称有助于调试,避免符号冲突。例如,ngx_http_core_module.c, ngx_http_finalize_request, NGX_HTTP_MAIN_CONF。
在 Lua 库的 C 组件中,我们也应该使用类似 resty_blah_(如果库名为 lua-resty-blah)的字符串作为编译单元中的所有 C 符号的前缀。
我们在 C 函数中定义局部变量的时候应该使用短名称。在 NGINX 核心代码中有大量常用的短名称,比如,cl, ev, ctx, v, p, q 等等。这些变量一般都是临时的、局部的。根据霍夫曼原则,我们应该在当前上下文环境中使用通用的短名称来避免单行干扰。即使是短名称也应该遵循 NGINX 的约定。不要自己创造新的规则,如果需要,且使用有意义的名称。即使是 p 和 q,它们也是字符串指针变量的常用名称,在字符串处理上下文环境当中使用。
C 语言结构体和联合名称尽可能的使用单词的完整拼写形式(除非成员名称太长)。例如,NGINX 核心结构体 ngx_http_request_s 当中有像 read_event_handler, upstream_states, request_body_in_persistent_file 这样很长的成员名称。
我们应该在 typedef 类型名称时使用 _t 结尾,定义结构体名称时使用 _s 结尾,定义枚举类型时使用 _e 结尾。在函数作用域当中定义类型时不受此约束。以下是 NGINX 核心的一些例子:
typedef struct ngx_connection_s ngx_connection_t;
typedef struct {
WSAOVERLAPPED ovlp;
ngx_event_t *event;
int error;
} ngx_event_ovlp_t;
struct ngx_chain_s {
ngx_buf_t *buf;
ngx_chain_t *next;
};
typedef enum {
ngx_pop3_start = 0,
ngx_pop3_user,
...
ngx_pop3_auth_external
} ngx_pop3_state_e;