我目前正在从事一个项目,其中包括一个使用 void 指针的有点通用的链表实现。为这些列表提供一些实用函数,我决定让元素的标识函数只接受 (const void *)。 在添加了必要的 const 关键字之后,我考虑了我的代码现在的正确性(如果我按照以前的方式实现了所有内容)。
由于编译器(GCC)没有警告我,我决定进行测试。 我用“gcc -g -Wall test.c”编译了以下代码,但没有收到 GCC 发出的任何警告。
#include <stdio.h>
#include <stdlib.h>
void testf(const void *testp){
*((int32_t *) testp) += 1;
}
void testf2(const int32_t *testp){
*((int32_t *) testp) += 1;
}
int main(){
int32_t testv = 0;
printf("%i \n", testv);
testf(&testv);
printf("%i \n", testv);
testf2(&testv);
printf("%i \n", testv);
return 0;
}
输出如下:
0
1
2
我没想到C真的会因此而崩溃,但我预计会收到编译器的警告。在此示例中,我仅进行转换,在我的实际函数中,我还将 const void 指针分配给 tmp 变量。
这是一个错误吗?
考虑到当今的编译器多么复杂,我至少会收到警告,提示我将指针转换为非 const 指针。如果我更改转换并在那里添加 const 关键字,GCC 会抛出我尝试分配给只读位置的常见错误
我是否应该重新考虑我对声明 const 指针的函数的信任?这不是我理解的契约(Contract):)
最佳答案
Is this a bug?
不,不是。通过强制转换,您是在对编译器说“我知道我在做什么”。
但是 GCC 确实有一个选项 -Wcast-qual
如果有意丢弃限定符,它会捕获。
关于const 指针契约(Contract)只是热空气?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32209181/