zoukankan      html  css  js  c++  java
  • [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);//普通宏调用
            printf("%d 
    ",M(N));//带参宏定义
            printf("%s 
    ",STR(taoshihan));//字符串化
            printf("%d 
    ",CON(123,456));//连接符
            int i=0;
            ALLOC_ZVAL(i);//多行宏定义
            printf("%d 
    ",i);
    }
  • 相关阅读:
    Xilinx之软件平台 ISE与Vivado前世今生
    博客开园
    第一天:开始你的Jobeet项目
    MySQL之alter语句用法总结
    SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
    MySQL中distinct和group by性能比较[转]
    GROUP BY,WHERE,HAVING之间的区别和用法
    split(),preg_split()与explode()函数分析与介
    解析posix与perl标准的正则表达式区别
    sql关键字的解释执行顺序
  • 原文地址:https://www.cnblogs.com/taoshihan/p/8282682.html
Copyright © 2011-2022 走看看