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 扩展代码时遇到的错误。

Dlang DMD 2.103 版本编译错误解决:访问成员变量 'extName' 问题

原文地址: https://www.cveoy.top/t/topic/n4mU 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录