apache 源码分析之 宏定义分析

背景知识:c语言宏定义详解
如果你已经对宏定义已经了解,下面的这部分能帮助你理解apache 的宏定义分析。
三、”#”和”##”的一些应用特例
1、合并匿名变量名

#define  ___ANONYMOUS1(type, 
var, line)  type  var##line
#define  __ANONYMOUS0(type, line)  ___ANONYMOUS1(type, _anonymous, line)
#define  ANONYMOUS(type)  __ANONYMOUS0(type, __LINE__)
例:ANONYMOUS(static int);  即: static int _anonymous70;  70
表 示该行行号;
第一层:ANONYMOUS(static 
int);  –>  __ANONYMOUS0(static int, __LINE__);
第二层:                        –>  ___ANONYMOUS1(static int
, _anonymous, 70);
第三层:                        –>  static int
  _anonymous70;
即每次只能解开当前层的宏,所以__LINE__在第二层才能被解开;
2、填充结构

#define  FILL(a)   {a, #a}
enum IDD{OPEN, CLOSE};
typedef struct
 MSG{
IDD id;
const char * msg
;
}MSG;
MSG _msg
[] = {FILL(OPEN), FILL(CLOSE)};
相当 于:
MSG _
msg[] = {{OPEN, ”OPEN”},
{CLOSE, ”CLOSE”}};
3
、记录文件名
#define  _GET_FILE_NAME(f)   #f
#define  GET_FILE_NAME(f)    _GET_FILE_NAME(f)
static char  FILE_NAME[] = GET_FILE_NAME(__FILE__);
4、 得到一个数值类型所对应的字符串缓冲大小

#define  _TYPE_BUF_SIZE(type)  
sizeof #type
#define  TYPE_BUF_SIZE(type)   _TYPE_BUF_SIZE(type)
char  buf
[TYPE_BUF_SIZE(INT_MAX)];
–>  char  buf
[_TYPE_BUF_SIZE(0x7fffffff)];
–>  char  buf[sizeof
 "0x7fffffff"];
这里相当于:
char  
buf[11]; 
 

 apache AP_DECLARE_HOOK 宏分析

=== hook定义
#define AP_DECLARE_HOOK(ret,name,args)      APR_DECLARE_EXTERNAL_HOOK(ap,AP,ret,name,args)
该宏定义是钩子结构的宏定义,看一下例子就能明白整个宏展开后的最终结果。
此类的宏定义还有很多,从ap_config.h文件提取宏定义相关的内容为如下。
#define AP_CONFIG_H
#define AP_DECLARE(type) type
#define AP_DECLARE_NONSTD(type) type
#define AP_DECLARE_DATA
#define AP_DECLARE(type) type __stdcall
#define AP_DECLARE(type) __declspec(dllexport) type __stdcall
#define AP_DECLARE_NONSTD(type) __declspec(dllexport) type
#define AP_DECLARE_DATA __declspec(dllexport)
#define AP_DECLARE(type) __declspec(dllimport) type __stdcall
#define AP_DECLARE_NONSTD(type) __declspec(dllimport) type
#define AP_DECLARE_DATA __declspec(dllimport)
#define AP_MODULE_DECLARE(type) type __stdcall
#define AP_MODULE_DECLARE(type) type
#define AP_MODULE_DECLARE_NONSTD(type) type
#define AP_MODULE_DECLARE_DATA
#define AP_MODULE_DECLARE_EXPORT
#define AP_MODULE_DECLARE(type) __declspec(dllexport) type __stdcall
#define AP_MODULE_DECLARE_NONSTD(type) __declspec(dllexport) type
#define AP_MODULE_DECLARE_DATA __declspec(dllexport)
#define AP_DECLARE_HOOK(ret,name,args) \
#define AP_IMPLEMENT_HOOK_BASE(name) \
#define AP_IMPLEMENT_HOOK_VOID(name,args_decl,args_use) \
#define AP_IMPLEMENT_HOOK_RUN_ALL(ret,name,args_decl,args_use,ok,decline) \
#define AP_IMPLEMENT_HOOK_RUN_FIRST(ret,name,args_decl,args_use,decline) \
#define AP_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL(ret,name,args_decl,args_use,ok, \
#define AP_OPTIONAL_HOOK(name,fn,pre,succ,order) \
#define AP_NONBLOCK_WHEN_MULTI_LISTEN 1
#define NO_LINGCLOSE
#define AP_HAVE_RELIABLE_PIPED_LOGS TRUE
#define AP_HAVE_DESIGNATED_INITIALIZER

 ==宏展开

/** macro to declare the hook correctly */
#define APR_DECLARE_EXTERNAL_HOOK(ns,link,ret,name,args) \
typedef ret ns##_HOOK_##name##_t args; \
link##_DECLARE(void) ns##_hook_##name(ns##_HOOK_##name##_t *pf, \
                                      const char * const *aszPre, \
                                      const char * const *aszSucc, int nOrder); \
link##_DECLARE(ret) ns##_run_##name args; \
APR_IMPLEMENT_HOOK_GET_PROTO(ns,link,name); \
typedef struct ns##_LINK_##name##_t \
    { \
    ns##_HOOK_##name##_t *pFunc; \
    const char *szName; \
    const char * const *aszPredecessors; \
    const char * const *aszSuccessors; \
    int nOrder; \
    } ns##_LINK_##name##_t;
例子:
AP_DECLARE_HOOK(int,access_checker,(request_rec *r))
APR_DECLARE_EXTERNAL_HOOK(ap,AP,  int ,  access_checker ,(request_rec *r))
typedef int ap_hook_access_checker_t (request_rec *);
AP_DECLARE(void) ap_hook_access_checker(ap_hook_name_t *pf,const char *const *aszPre,const char * const *aszSucc, int nOrder);
AP_DECLARE(int) ap_run_access_checker  (request_rec *);</