在c中将Const转换为非Const

rya*_*968 8 c casting

我正在开展一个学校项目,我需要重现许多C库函数.我只是在努力解决它的一个具体方面.

如果您查看手册页,memchr您将看到它需要一个const void *输入并返回一个普通的void *.我会假设它们在函数的某个地方转换const为非const返回变量.

但是,当我这样做(clang -Weverything +Werror)时,它将无法编译.它可以在没有-Weverything标签的情况下工作但是如果可能的话我宁愿使用它.

有没有"正确"的方法来做到这一点?

小智 1

这个黑客就可以做到。实际上,除了最不起眼的平台之外,其他平台上sizeof(void *)都是相同的。sizeof(size_t)尽管如此,我还是建议不要使用这个。你应该放弃-Weverything。标准 C 函数的历史可以追溯到 70 年代,最初的 C 编译器远没有今天启用所有警告的 Clang 或 GCC 严格。事实上,您会在其中一些中发现一些“不安全”的东西,这是不可避免的。

void * memchr_(const void * ptr_, int c, size_t num);

int main(void)
{
    unsigned char ary[] = { 1, 6, 2, 45, 23, 75, 23, 43, 23 },
                  * ptr = NULL;

    ptr = memchr_(ary, 23, sizeof(ary) / sizeof(ary[0]));
    printf("ary = %p, ptr = %p, *ptr = %u\n", (void *)ary, (void *)ptr, *ptr);
    return 0;
}

void * memchr_(const void * ptr_, int c, size_t num)
{
    size_t i;
    const unsigned char * ptr = ptr_;

    for(i = 0; i < num; i++) {
        if(ptr[i] == (unsigned char)c) {
            /* Casting to size_t first so that the compiler doesn't complain */
            return (unsigned char *)(size_t)ptr + i;
        }
    }
    return NULL;
}
Run Code Online (Sandbox Code Playgroud)

  • @user1803425:我建议您对上面的代码进行注释,并添加有关使用“uintptr_t”而不是“size_t”的额外注释。 (2认同)