专栏首页陶士涵的菜地[PHP] PHP源码常用代码中的宏定义

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

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 <stdio.h>
#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);
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [PHP] strpos stripos strrpos strripos的区别

    stripos — 查找字符串首次出现的位置(不区分大小写),应使用 === 运算符来测试此函数的返回值

    陶士涵
  • [日常] 面试知识点总结(持续更新)

    陶士涵
  • [MySQL] 测试where group by order by的索引问题

    1. select * from test where a=xx group by b order by c 如何加索引

    陶士涵
  • 一文概述 2018 年深度学习 NLP 十大创新思路

    AI 科技评论按:Sebastian Ruder 是一位 NLP 方向的博士生、研究科学家,目前供职于一家做 NLP 相关服务的爱尔兰公司 AYLIEN,同时,...

    AI科技评论
  • 一文概述 2018 年深度学习 NLP 十大创新思路

    AI 科技评论按:Sebastian Ruder 是一位 NLP 方向的博士生、研究科学家,目前供职于一家做 NLP 相关服务的爱尔兰公司 AYLIEN,同时,...

    AI研习社
  • 当我们使用虚函数的时候,我们究竟想干什么?

    首先,我们要搞清楚女神的所作所为,即语法规范。然后再去探究她背后的逻辑道理。她的语法说来也不复杂,概括起来就这么几条:

    用户2617681
  • 怎么选择抓包软件?适合你的才是最好的

    作为一名测试,会抓包是比不可少的,比较主流的抓包工具如:Fiddler、Charles、wireshark等,市面上这么多的抓包工具,各有优势和劣势,没必要全都...

    小雯子打豆豆
  • 一口气搞懂《虚函数和纯虚函数》

    首先,我们要搞清楚女神的所作所为,即语法规范。然后再去探究她背后的逻辑道理。她的语法说来也不复杂,概括起来就这么几条:

    用户2617681
  • javascript 防止重复点击

    IT故事会
  • 前端课程——颜色与单位

    CSS 中的前景色和背景色就是 color 和 backgorund-color 两个属性,其中 color 属性表示前景色,background-color ...

    Dreamy.TZK

扫码关注云+社区

领取腾讯云代金券