我正在开展一个学校项目,我需要重现许多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)
| 归档时间: |
|
| 查看次数: |
3208 次 |
| 最近记录: |