PHP扩展参数定义结构和操作详解
2011-12-22 01:50
519 查看
结构体
操作这个结构的宏:
随便找一段参数定义代码:
那么这段代码,经过上面宏替换之后就变成了,注意,在宏里面#表示把后面的代码字符串化:
好了,现在写段C代码来测试下吧。一下代码测试环境WIN7 64bit professional +VS2010 ultimate:
在中断处截图看一下,发现:
看到了吧,字符串和字符串长度都有的。
遗忘的C语言细节:
1.#define XXXXX(a,) #a 即表示 把a表现为字符串。 XXXXXX(shyandsy) ==== "shyandsy"
2.sizeof()可以计算字符串长度。结果是字符个数+1,因为有\0结尾。
sizeof("shyandsy")-1 = 8
/*PHP扩展中函数参数结构*/ typedef struct _zend_arg_info { const char *name; //参数名 zend_uint name_len; //参数名长度 const char *class_name; //类名 zend_uint class_name_len; //类名长度 zend_bool array_type_hint; zend_bool allow_null; zend_bool pass_by_reference; zend_bool return_reference; int required_num_args; } zend_arg_info;
操作这个结构的宏:
#define ZEND_ARG_INFO(pass_by_ref, name) \ { #name, sizeof(#name)-1, NULL, 0, 0, 0, pass_by_ref, 0, 0 }, #define ZEND_BEGIN_ARG_INFO(name, pass_rest_by_reference) \ ZEND_BEGIN_ARG_INFO_EX(name, pass_rest_by_reference, ZEND_RETURN_VALUE, -1) #define ZEND_BEGIN_ARG_INFO_EX(name, pass_rest_by_reference, return_reference, required_num_args) \ static const zend_arg_info name[] = { \ { NULL, 0, NULL, 0, 0, 0, pass_rest_by_reference, return_reference, required_num_args }, #define ZEND_END_ARG_INFO() };
随便找一段参数定义代码:
ZEND_BEGIN_ARG_INFO_EX(arginfo_dir_openFile, 0, 0, 0) ZEND_ARG_INFO(0, open_mode) ZEND_ARG_INFO(0, use_include_path) ZEND_ARG_INFO(0, context) ZEND_END_ARG_INFO();
那么这段代码,经过上面宏替换之后就变成了,注意,在宏里面#表示把后面的代码字符串化:
static const zend_arg_info arginfo_dir_openFile[]={ {NULL, 0, NULL, 0, 0, 0, 0, 0, 0), {"open_mode", sizeof("openmode")-1, NULL, 0, 0, 0, 0, 0, 0}, {"use_include_path", sizeof("use_include_path")-1, NULL, 0, 0, 0, 0, 0, 0}, {"context", sizeof("context")-1, NULL, 0, 0, 0, 0, 0, 0} };
好了,现在写段C代码来测试下吧。一下代码测试环境WIN7 64bit professional +VS2010 ultimate:
#include <iostream> using namespace std; //参数定义结构 #define ZEND_ARG_INFO(pass_by_ref, name) \ { #name, sizeof(#name)-1, NULL, 0, 0, 0, pass_by_ref, 0, 0 }, //参数结构 typedef struct _zend_arg_info { const char *name; //参数名 unsigned int name_len; //参数名长度 const char *class_name; //类名 unsigned int class_name_len; //类名长度 bool array_type_hint; bool allow_null; bool pass_by_reference; bool return_reference; int required_num_args; } zend_arg_info; int main() { static const zend_arg_info arginfo_dir_openFile[]={ {NULL, 0, NULL, 0, 0, 0, 0, 0, 0}, ZEND_ARG_INFO(0, open_mode) ZEND_ARG_INFO(0, use_include_path) ZEND_ARG_INFO(0, context) }; _asm int 3; //断点 return 1; }
在中断处截图看一下,发现:
看到了吧,字符串和字符串长度都有的。
遗忘的C语言细节:
1.#define XXXXX(a,) #a 即表示 把a表现为字符串。 XXXXXX(shyandsy) ==== "shyandsy"
2.sizeof()可以计算字符串长度。结果是字符个数+1,因为有\0结尾。
sizeof("shyandsy")-1 = 8
相关文章推荐
- PHP扩展代码结构详解
- PHP扩展数据库连接参数说明详解
- PHP中的预定义变量$_SERVER参数详解
- Redis安装、配置、操作、持久化、主从、phpredis扩展安装使用详解之操作使用
- [PDO绑定参数]使用PHP的PDO扩展进行批量更新操作
- [PDO绑定参数]使用PHP的PDO扩展进行批量更新操作
- 菜鸟学php扩展 之 详解php扩展的参数返回(五)
- Redis安装、配置、操作、持久化、主从、phpredis扩展安装使用详解之安装配置
- 菜鸟学php扩展 之 详解扩展函数的传参(如何获取参数)(三)
- Redis安装、配置、操作、持久化、主从、phpredis扩展安装使用详解之持久化与主从
- PHP扩展代码结构详解
- PHP扩展代码结构详解
- PHP扩展代码结构详解
- 小甲鱼PE详解之IMAGE_DOS_HEADER结构定义即各个属性的作用(PE详解01)
- PHP中register_globals参数为OFF和ON的区别(register_globals 使用详解)
- php-fpm - 启动参数及重要配置详解
- PHP编译参数详解
- 详解php获取url地址栏及各种参数的方法
- 深入PHP中的HashTable结构详解
- 详解PHP使用DOMDocument类遍历、增加、修改、删除XML节点操作