【发布时间】:2023-03-18 09:16:02
【问题描述】:
static char buf[8];
void foo(){
const char* ptr = buf;
/* ... */
char* q = (char*)ptr;
}
上面的sn-p会生成"warning: cast discards ‘__attribute__((const))’ qualifier from pointer target type [-Wcast-qual]"。我喜欢-Wcast-qual,因为它可以帮助我避免意外写入我不应该写入的内存。
但现在我只想抛弃 const 一次(而不是整个文件或项目)。它指向的内存是可写的(就像上面的buf)。我宁愿不要从 ptr 中删除 const,因为它在其他地方使用并且保持指针(一个 const 和一个非常量)似乎是一个更糟糕的主意。
【问题讨论】:
-
为什么不直接
char *q = buf;? -
我猜这从 sn-p 中不清楚,我在演员表之前对 ptr 执行算术。
-
最好使用 buff 的索引而不是操作指针,然后传递例如
&buff[i]而不是指针? -
虽然该方法需要更改现有代码,但它似乎是可行的方法。我希望某个属性或关键字可以说“嘿,我知道我在做什么,忽略这个”,就像你可以对未使用的变量做的那样。
-
一个非常相似的警告是
-Wwrite-strings,gcc 4.8 报告为error: initialization discards 'const' qualifier from pointer target type [-Werror]。不幸的是,此版本忽略了-Wno-error=write-strings。