php调用C代码的实现方法(3)

如果想实现可选参数的话,例如一个字符串,一个浮点,再加一个可选的bool型,可以用"sd|b"来表示。
和scanf有一点不同的是,对于字符串,你要提供两个变量来存储,一个是char *,存字符串的地址,一个int,来存字符串的长度。这样有必要的时候,你可以安全的处理二进制数据。

那么返回值怎么办呢?
使用下面一组宏来表示:

RETURN_STRING
RETURN_LONG
RETURN_DOUBLE
RETURN_BOOL
RETURN_NULL

注意RETURN_STRING有两个参数
当你需要复制一份字符串时使用
RETURN_STRING("Hello World", 1);

否则使用
RETURN_STRING(str, 0);

这里涉及到了模块中内存的分配,当你申请的内存需要php程序中去释放的话,请参照如下表

Traditional Non-Persistent Persistent
malloc(count)
calloc(count, num)
  emalloc(count)
ecalloc(count, num)
  pemalloc(count, 1)*
pecalloc(count, num, 1)
 
strdup(str)
strndup(str, len)
  estrdup(str)
estrndup(str, len)
  pestrdup(str, 1)
pemalloc() & memcpy()
 
free(ptr)   efree(ptr)   pefree(ptr, 1)  
realloc(ptr, newsize)   erealloc(ptr, newsize)   perealloc(ptr, newsize, 1)  
malloc(count * num + extr)**   safe_emalloc(count, num, extr)   safe_pemalloc(count, num, extr)  

一般我们使用Non-Persistent中列出的这些好了。

基本上就是这样,可以开始写一个php的扩展了。
从我目前的应用来看,能操纵字符串就够用了,所以我就只能介绍这么多了。

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/1c30cd6acb2a330899a1cbfb1862aa35.html