const 指针契约(Contract)只是热空气?

标签 c pointers gcc methods constants

我目前正在从事一个项目,其中包括一个使用 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/

相关文章:

c - 通过中断在模式之间切换

c - "Dictionary"未声明

c++ - 访问存储在指针变量指向的地址中的值(这是一个地址)返回垃圾值?

c++ - g++中链接的Preprocessor程序类似于gcc中的cpp程序

c - 为什么以下程序打印 "Yes"而不是 "No"?

c - 相同的顺序/相同的牌,即使我已经洗牌

c - 不明白为什么C程序崩溃,字符串指针数组

c++ - map 和 unordered_map 包含指向 double 的指针?

内存映射的 gcc 链接文件,那是什么语法?

c++ - libconfig 不是静态链接。如何编译成程序