PHP源码常用代码中的定义
#define 宏名 字符串
#表示这是一条预处理命令,所有的预处理命令都以#开头。define是预处理命令。宏名是标识符的一种,命名规则和标识符相同。字符串可以是常数、表达式等。
在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。
1.#define php_function zend_function
在编译预处理阶段会把php_function 替换成 zend_function
带参数宏定义:
#define 宏名(形参列表) 字符串
允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数,这点和函数有些类似。
1.#define zend_function(name) zend_named_function(zend_fn(name))
会把zend_function(count) 替换成 zend_named_function(zend_fn(count))
宏参数的字符串化和宏参数的连接:
在宏定义中使用#用来将宏参数转换为字符串,也就是在宏参数的开头和末尾添加引号。
##称为连接符,用来将宏参数或其他的串连接起来。
1.#define zend_fn(name) zif_##name
带参宏定义加连接符,会把zend_fn(count) 替换成 zif_count
多表达式宏定义:
在宏定义中使用了 do{ }while(0) 语句格式,里面的代码至少会执行一次,不破坏原有的结构
源码总结:
php如下源码
#define php_function zend_function
#define zend_function(name) zend_named_function(zend_fn(name))
#define zend_fn(name) zif_##name
#define zend_named_function(name) void name(internal_function_parameters)
#define internal_function_parameters int ht, zval *return_value, zval **return_value_ptr, zval *this_ptr, int return_value_used tsrmls_dc
php_function(count);
经过预处理器处理后:
1.zend_function(count)
2.zend_named_function(zend_fn(count))
3.zend_named_function(zif_count)
4.void zif_count(internal_function_parameters)
5.void zif_count(int ht, zval *return_value, zval **return_value_ptr, zval *this_ptr, int return_value_used tsrmls_dc)
练习:
#include
#define n 100
#define m(y) y*y
#define str(s) #s
#define con(a,b) a##b
#define alloc_zval(z) do {\
z++;\
z=z+100;\
} while (0)
int main(){
printf("%d \n",n);//普通宏调用
printf("%d \n",m(n));//带参宏定义
printf("%s \n",str(taoshihan));//字符串化
printf("%d \n",con(123,456));//连接符
int i=0;
alloc_zval(i);//多行宏定义
printf("%d \n",i);
}
上一篇: 啊哈算法之简单深度优先搜索案例
下一篇: java容器一:Collection概述