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);

}

php 如何宏定义,[PHP] PHP源码常用代码中的宏定义相关推荐

  1. OpenCV SIFT源码讲解——代码逻辑宏观窥探

    OpenCV SIFT源码讲解--代码逻辑宏观窥探 一.暴露在外的接口:SIFT 二.隐藏在SIFT背后的本质:SIFT_Impl 三.使用sift算法全流程 一.暴露在外的接口:SIFT 一般来说, ...

  2. 读Zepto源码之代码结构

    虽然最近工作中没有怎么用 zepto ,但是据说 zepto 的源码比较简单,而且网上的资料也比较多,所以我就挑了 zepto 下手,希望能为以后阅读其他框架的源码打下基础吧. 源码版本 本文阅读的源 ...

  3. 转载从CEGUI源码看代码规范

    <转载>从CEGUI源码看代码规范 原文:http://www.cnblogs.com/coderzh/archive/2011/05/08/cegui_coding_style.html ...

  4. 5单个编译总会编译全部_玩转Android10(五)源码编译开发中常用命令

    源码开发编译中,熟练掌握常用命令,可以提高开发工作效率.Android源码中,将相关的命令分为如下几类: 1.初始化源码编译环境 初始化编译环境,为后续提供如lunch.make.xxgrep.god ...

  5. JDK源码解析 Comparator 中的策略模式

    JDK源码解析 Comparator 中的策略模式.在Arrays类中有一个 sort() 方法,如下: public class Arrays{public static <T> voi ...

  6. 阅读react-redux源码(五) - connectAdvanced中store改变的事件转发、ref的处理和pure模式的处理

    阅读react-redux源码 - 零 阅读react-redux源码 - 一 阅读react-redux源码(二) - createConnect.match函数的实现 阅读react-redux源 ...

  7. 深入分析ConcurrentHashMap的源码设计(中)-hash冲突

    深入分析ConcurrentHashMap的源码设计(上) 深入分析ConcurrentHashMap的源码设计(中) 深入分析ConcurrentHashMap的源码设计(下) 一.前言: 本章节, ...

  8. Spring源码 - 从缓存中获取单例Bean

    # Spring源码 - 从缓存中获取单例Bean Spring版本:Spring 5.3.13-release # 1.从缓存中获取单例Bean 单实例Bean在Spring的同一个容器中只会创建一 ...

  9. MD500E源码和代码解析文档 代码包含了同步机FOC控制算法、电阻、电感、磁链、反电动势

    MD500E源码和代码解析文档 代码包含了同步机FOC控制算法.电阻.电感.磁链.反电动势.死区补偿.过调制限制.弱磁等算法,支持无感和有感,亲自带电机运行过. ID:6715672157800168 ...

最新文章

  1. 给定a、b两个文件,各存放50亿个url,每个url各占用64字节,内存限制是4G,如何找出a、b文件共同的url?
  2. Elastic-Job中的DataFlowJob
  3. Condition类必须配合Mutex使用,why?
  4. spring 环境配置
  5. 漫步线性代数三——高斯消元法
  6. Connect to repo.maven.apache.org:443 [repo.maven.apache.org/151.101.24.215] failed: connect timed ou
  7. java异常中的Error和Exception的区别是什么?
  8. 【hadoop】19.MapReduce-手机流量统计
  9. 进销存excel_excel进销存管理系统
  10. 单片机c语言中的精确延时程序,单片机精确毫秒延时函数
  11. web渗透测试----14、CSRF(跨站请求伪造攻击)
  12. div 设置a4大小_CSS设置A4纸张大小_others_酷徒编程知识库
  13. SpringBoot签名验签
  14. 7-3 判断素数 (10 分)
  15. PotPlayer和MPC-HC挂载VSFilterMod加载外挂特效字幕的方法
  16. 自动驾驶 Apollo 源码分析系列,感知篇(一)
  17. js的爬山之路原型与原型链~~狂徒李四
  18. android手机api等级_什么是Android API 级别?
  19. vue中使用echart实现三维立体图
  20. 旅游防骗攻略[整理]

热门文章

  1. 【雕爷学编程】Arduino动手做(5)---热敏温度传感器模块
  2. phpnow安装apache失败及phpnow绑定域名解决方法,网站发布到外网
  3. 使用dfs求解修道士和野人问题
  4. Android 今日头条适配详解
  5. 全球与中国射频识别零售管理市场深度研究分析报告
  6. arm-gcc链接器和链接脚本
  7. Win7 TAP-Windows Adapter V9提示Windows 要求已数字签名的驱动程序
  8. 口令暴力破解--Telnet协议暴力破解、数据库暴力破解与远程桌面暴力破解
  9. 对智能手表的功能买点认知介绍
  10. opencv调用basler简单示例