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中结构体定义了该“虚函数”的输入输出

posted @ 2020-06-01 10:37  汪淼焱  阅读(1205)  评论(0)    收藏  举报