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