define 宏名 字符串。define 宏名 字符串。

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

宏参数的字符串化和宏参数的总是:
以宏定义中使用#用来拿宏参数转换为字符串,也尽管是以宏参数的上马和最后添加引号。
##名为连接符,用来拿宏参数或其他的差连接起来。

源码总结:
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如下源码
#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

1.#define ZEND_FN(name) zif_##name
拉动参宏定义加连接符,会把ZEND_FN(count) 替换成 zif_count

PHP源码常用代码宏定义:
#define 宏名 字符串
#表示马上是同等条预处理命令,所有的预处理命令还为#千帆竞发。define是优先处理命令。宏名是标识符的均等种,命名规则及标识符相同。字符串可以是常数、表达式等。
每当编译预处理时,对先后中有着出现的“宏名”,都为此宏定义中之字符串去顶替换,这称之为“宏代换”或“宏展开”。

练习:

大多表达式宏定义:
当宏定义中使用了 do{ }while(0)
语句格式,里面的代码至少会尽同一不善,不损坏原有的布局

PHP源码常用代码宏定义:
#define 宏名 字符串
#表示马上是一致条预处理命令,所有的预先处理命令还因#开始。define是先期处理命令。宏名是标识符的如出一辙种,命名规则及标识符相同。字符串可以是常数、表达式等。
于编译预处理常,对程序中具备出现的“宏名”,都为此宏定义中的字符串去顶替换,这叫“宏代换”或“宏展开”。

1.#define PHP_FUNCTION ZEND_FUNCTION
当编译预处理等会把PHP_FUNCTION 替换成 ZEND_FUNCTION

由此预处理器处理后:
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)

 

 

练习:

大多表达式宏定义:
当宏定义中使用了 do{ }while(0)
语句格式,里面的代码至少会尽同一浅,不损坏原有的构造

带参数宏定义:
#define 宏名(形参列表) 字符串
同意宏带有参数。在宏定义中之参数称为形式参数,在宏调用中的参数称为实际参数,这点和函数有些近乎。

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)

1.#define ZEND_FUNCTION(name) ZEND_NAMED_FUNCTION(ZEND_FN(name))
会把ZEND_FUNCTION(count) 替换成 ZEND_NAMED_FUNCTION(ZEND_FN(count))

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

带来参数宏定义:
#define 宏名(形参列表) 字符串
兴宏带有参数。在宏定义中之参数称为形式参数,在宏调用中之参数称为实际参数,这点及函数有些看似。

1.#define ZEND_FN(name) zif_##name
拉动参宏定义加连接符,会将ZEND_FN(count) 替换成 zif_count

宏参数的字符串化和宏参数的连年:
以宏定义中使用#为此来用宏参数转换为字符串,也便是当宏参数的开和尾声添加引号。
##名叫连接符,用来用宏参数或其他的错连接起来。

PHP_FUNCTION(count);

1.#define PHP_FUNCTION ZEND_FUNCTION
于编译预处理等会把PHP_FUNCTION 替换成 ZEND_FUNCTION

1.#define ZEND_FUNCTION(name) ZEND_NAMED_FUNCTION(ZEND_FN(name))
会把ZEND_FUNCTION(count) 替换成 ZEND_NAMED_FUNCTION(ZEND_FN(count))

相关文章