卡在“cast discards 'const' qualifier”上
我有一个代码:
int cmp_str_and_dirent(const void *key, const void *elem) {
const char *name = key;
const struct dirent *de = *(const struct dirent**)elem;
^ Cast discards `const` qualifier
return strcmp(name, de->d_name);
}
struct dirent **entries;
file_count = scandir(path, &entres, NULL, alphasort);
struct dirent *found = bsearch(name, entries, file_count,
sizeof(struct dirent*), cmp_str_and_dirent);
所以问题是:如何正确地从const void *
中解引用,如果该指针实际上是指向结构体的指针?
编译器gcc 11.2.1,使用-std=gnu11
1条答案
按热度按时间yhuiod9q1#
虽然C允许将类型限定符(如
const
)放在类型名称之前,以便使它们的用法看起来类似于存储类(如register
),但当它们在指针声明中使用时,这会模糊它们的含义。虽然register int *p
会声明一个带有register
存储类的指针来标识int
,但const int *q
定义了一个指向const int
的非常量指针。将const
限定符移到类型名称之后,并认识到它们相对于星号的位置是重要的,所有这些都将变得清晰。我认为你想要的是将指针转换为(struct dirent const * const *)
,即一个指向只读对象的只读指针的指针。