PHP扩展参数定义结构和操作详解

结构体

/*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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值