Dlang DMD 2.103 版本编译错误解决:访问成员变量 'extName' 问题
Dlang DMD 2.103 版本编译错误解决:访问成员变量 'extName' 问题
在使用 Dlang DMD 2.103 版本编译 PHP 扩展代码时,可能会遇到如下错误:
Error: need `this` to access member `extName`
该错误通常出现在 extensionInfoFunc 函数中,因为在该函数中,使用了 this.extName.ptr 访问 extName 成员变量,但 this 指针在该函数中并不可用。
解决方法
为了解决这个问题,需要将 extName 定义为全局变量,或者将其作为参数传递给 extensionInfoFunc 函数。以下是一种可能的修改方案:
import php7;
import core.stdc.stdio;
import std.stdio: writeln;
extern(C) int rt_init();
extern(C) int rt_term();
struct Extension
{
static zend_module_entry phpExtEntry;
private string extName = "";
private string versionName = "0.1";
php_extension_func_callback startFunc = null;
php_extension_func_callback shutDownFunc = null;
php_extension_func_callback beforeRequestFunc = null;
php_extension_func_callback afterRequestFunc = null;
private php_extension_info_callback extensionInfoFunc;
this(string extName, string versionName = "0.1")
{
this.extName = extName;
this.versionName = versionName;
extensionInfoFunc = function void(zend_module_entry* m)
{
phpx_print_extension_info(extName.ptr);
};
}
zend_module_entry* createExtension()
{
phpExtEntry = phpx_create_module_entry(extName.ptr, versionName.ptr, null,
startFunc, shutDownFunc, beforeRequestFunc,
afterRequestFunc, extensionInfoFunc);
return &phpExtEntry;
}
}
extern(C)
{
zend_module_entry* get_module()
{
Extension e = Extension("first_test_ext");
return e.createExtension();
}
}
在该解决方案中,将 extensionInfoFunc 函数的定义移至 Extension 结构体的构造函数中,并将 extName 作为参数传递给 extensionInfoFunc 函数。
注意事项
- 确保
phpx_print_extension_info函数的定义与你的 PHP 扩展代码匹配。 - 在使用全局变量时,需要谨慎处理其生命周期和访问权限。
希望本文能够帮助你解决 Dlang DMD 2.103 版本编译 PHP 扩展代码时遇到的错误。
原文地址: https://www.cveoy.top/t/topic/n4mU 著作权归作者所有。请勿转载和采集!