C结构体struct内部函数指针


参考别人观点有如下几点:

  1. 模拟OOP中的虚函数
  2. 函数指针几乎总是为了运行时多态

安卓recovery部分涉及fuseSideload部分有如下使用场景:

struct provider_vtab {
    // read a block
    int (*read_block)(void* cookie, uint32_t block, uint8_t* buffer, uint32_t fetch_size);

    // close down
    void (*close)(void* cookie);
};

int run_fuse_sideload(struct provider_vtab* vtab, void* cookie,
                      uint64_t file_size, uint32_t block_size);
int read_block_adb(void* data, uint32_t block, uint8_t* buffer, uint32_t fetch_size) {
    adb_data* ad = reinterpret_cast<adb_data*>(data);

    if (!WriteFdFmt(ad->sfd, "%08u", block)) {
        fprintf(stderr, "failed to write to adb host: %s\n", strerror(errno));
        return -EIO;
    }

    if (!ReadFdExactly(ad->sfd, buffer, fetch_size)) {
        fprintf(stderr, "failed to read from adb host: %s\n", strerror(errno));
        return -EIO;
    }

    return 0;
}

static void close_adb(void* data) {
    adb_data* ad = reinterpret_cast<adb_data*>(data);
    WriteFdExactly(ad->sfd, "DONEDONE");
}

int run_adb_fuse(int sfd, uint64_t file_size, uint32_t block_size) {
    adb_data ad;
    ad.sfd = sfd;
    ad.file_size = file_size;
    ad.block_size = block_size;

    provider_vtab vtab;
    vtab.read_block = read_block_adb;
    vtab.close = close_adb;

    return run_fuse_sideload(&vtab, &ad, file_size, block_size);
}

可以看到具体实现都是在实例化时指向上去的,c中结构体定义了该“虚函数”的输入输出


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM