加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > PHP > 正文

[PHP] PHP源码常用代码中的宏定义

发布时间:2020-05-25 03:13:40 所属栏目:PHP 来源:互联网
导读:PHP源码常用代码宏定义:#define 宏名 字符串#表示这是一条预处理命令,所有的预处理命令都以#开头。define是预处理命令。宏名是标识符的一种,命名规则和标识符相同。字符串可以是常数、表达式等。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中

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,int return_value_used TSRMLS_DC)

练习:

#include N 100 M(y) y*y STR(s) #s CON(a,b) a##b ALLOC_ZVAL(z) do {++=z+ (<span style="color: #0000ff">int<span style="color: #000000"> main(){
printf(<span style="color: #800000">"<span style="color: #800000">%d n<span style="color: #800000">",N);<span style="color: #008000">//<span style="color: #008000">普通宏调用
printf(<span style="color: #800000">"<span style="color: #800000">%d n<span style="color: #800000">",M(N));<span style="color: #008000">//<span style="color: #008000">带参宏定义
printf(<span style="color: #800000">"<span style="color: #800000">%s n<span style="color: #800000">",STR(taoshihan));<span style="color: #008000">//<span style="color: #008000">字符串化
printf(<span style="color: #800000">"<span style="color: #800000">%d n<span style="color: #800000">",CON(<span style="color: #800080">123,<span style="color: #800080">456));<span style="color: #008000">//<span style="color: #008000">连接符
<span style="color: #0000ff">int i=<span style="color: #800080">0<span style="color: #000000">;
ALLOC_ZVAL(i);<span style="color: #008000">//<span style="color: #008000">多行宏定义
printf(<span style="color: #800000">"<span style="color: #800000">%d n<span style="color: #800000">"<span style="color: #000000">,i);
}

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读