解决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
相关产品推荐
相关产品推荐

