You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决const void*转struct**时的const限定符丢弃编译错误

解决“cast discards 'const' qualifier”编译错误

错误原因

你在cmp_str_and_dirent里的类型转换层级匹配错误。elem是const void*类型,它实际指向的是struct dirent*(因为entries是struct dirent**,bsearch会把数组中每个struct dirent*的地址传给elem)。这里的const修饰的是不能通过elem修改它指向的那个struct dirent*变量,而非不能修改该变量指向的结构体内容。直接转成const struct dirent**会丢弃外层指针的const限定,因此触发编译错误。

正确写法

你需要匹配正确的const层级,把elem转换成struct dirent* const *(指向struct dirent*的const指针)或const struct dirent* const *后再解引用:

int cmp_str_and_dirent(const void *key, const void *elem) {
    const char *name = key;
    // 匹配const层级的正确转换
    const struct dirent *de = *(const struct dirent* const *)elem;
    return strcmp(name, de->d_name);
}

或者更简洁的等效写法:

int cmp_str_and_dirent(const void *key, const void *elem) {
    const char *name = key;
    const struct dirent *de = *(struct dirent* const *)elem;
    return strcmp(name, de->d_name);
}

补充说明

这样的转换既符合bsearch的参数要求,也不违反const限定规则:

  • struct dirent* const *表示:不能通过该指针修改它指向的struct dirent*变量(即数组里的指针本身不可修改),但允许修改该指针指向的结构体内容(我们这里仅读取d_name,所以用const struct dirent*接收更安全)。
  • 最终de是const struct dirent*类型,保证不会意外修改结构体内容,契合函数的只读逻辑。

内容的提问来源于stack exchange,提问作者White Owl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 02:15:29