gpt4 book ai didi

c++ - 由于函数指针类型定义和具有正确 const 逻辑的分配函数不匹配而产生编译警告

转载 作者:太空狗 更新时间:2023-10-29 21:39:04 27 4
gpt4 key购买 nike

我在我正在处理的项目中使用外部库。它是用C语言编写的。在外部库中,定义如下:

typedef void* (*foo_fn) (void *arg1, void *arg2);

其中一个库的 API/函数将函数指针(上述类型)作为输入。

现在,在我的模块中,我正在实现一个如下所述的函数,因为我知道这对该函数的逻辑更有意义:

void * foo_fn (const void* const arg1, void* const arg2);

当我将此函数的指针传递给 API 时,我收到以下警告:

warning: assignment from incompatible pointer type

我理解上述警告背后的原因,但我想知道以下哪项是正确的做法?

  1. 像上面那样定义函数并忽略警告。
  2. “严格遵守”外部库的期望并忽略对我的函数有意义的逻辑并将函数定义如下?

    void * foo_fn (void* arg1, void* arg2);

最佳答案

即使该函数符合 LSP 的计算机科学概念下所需的签名,指针也添加了 const 限定(这是安全的),并且严格要求指针类型表示和布局兼容(这意味着能够将 &px 存储在 X* px; 类型的变量中 const X* const* const ,这是合法的),在 C++ 中,函数指针类型不同,通过错误类型的函数指针调用是未定义的行为

这很重要,因为它赋予优化器特殊权限来破坏执行此操作的代码,即使原始(未优化)编译会在任何架构上生成工作代码。

例如,如果整个程序中只有一个函数与函数指针实际匹配,优化器可以创建对该函数的直接调用(甚至内联),忽略函数指针中的实际地址. (允许动态加载的平台使这变得复杂,但在某些情况下,使用具有本地链接的类型可能会排除动态加载的函数与签名匹配)

关于c++ - 由于函数指针类型定义和具有正确 const 逻辑的分配函数不匹配而产生编译警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33850786/

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