gpt4 book ai didi

c - 这两种指针类型真的不兼容吗?

转载 作者:太空宇宙 更新时间:2023-11-04 02:00:56 26 4
gpt4 key购买 nike

我有以下 typedef 和高阶函数:

typedef void block_fn (struct block*, block_sector_t, void* buffer);

static void block_apply (struct page* page, block_fn *block_fn) {
int i = 0;
for (i = 0; i < PAGE_SECTORS; i++) {
block_fn(swap.device, page->sector * PAGE_SECTORS + i, page_kpage(page)
+ i * BLOCK_SECTOR_SIZE);
}
}

我在以下两个地方调用它:

block_apply (page, &block_write);
...
block_apply (page, &block_read);

block_readblock_write 具有以下签名:

void block_read (struct block *, block_sector_t, void *);
void block_write (struct block *, block_sector_t, const void *);

这导致 GCC 提示:

../../vm/swap.c:94:13: note: expected void (*)(struct block *, block_sector_t, void *) but argument is of type void (*)(struct block *, block_sector_t, const void *)

GCC 有权生气吗?这样传递这个函数指针安全吗?

编辑:我知道这两个函数指针属于不同类型。我的问题是以这种方式使用它们是否安全:它会触发未定义的行为吗?是否存在以这种方式传递具有不兼容类型的函数指针会导致意外发生的情况?

最佳答案

是的,一般来说提示是对的,尽管对你的情况没有意义

通过说 const void *,您声明该函数不会修改指向的数据。通过省略 const,您是在说它可能。

函数签名是调用者和被调用者之间的契约,即编译器执行。编译器阻止代码公布比它更严格的签名实现(例如,在写入参数时通告只读参数。)

不过,在您的情况下,您只需要一个指向具有有限类型检查的函数的指针。

您可以将类型声明为采用 const void *,并使用类型转换覆盖 const当您调用它时。

关于c - 这两种指针类型真的不兼容吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27309183/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com