作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在开发一个程序,该程序在许多地方使用通用 struct
来穿梭于相关值之间。此结构包含一个字段 char* s
。
许多函数修改s
;但是,有时该结构用于将信息传递给只会读取它的函数。在这些情况下,通常用于初始化 s
的字符串是 const char*
。但是,将其分配给 s
会导致编译器警告。
虽然技术上是正确的,但这个警告感觉不对,因为该函数不修改 s
。有没有办法绕过这个警告,除了抛弃 const 之外?有没有什么方法可以让函数 promise 它将结构成员视为 const
?
例子:
#include <stdio.h>
struct mystruct{
int i;
char* s;
};
void i_only_read(const struct mystruct *m){
printf("mystruct: i=%d, s=%s\n", m->i, m->s);
}
int main(int argc, char **argv){
const char* cstr = "Hello";
struct mystruct m;
m.i=99;
/* gcc warning: assignment discards ‘const’ qualifier
* from pointer target type
*/
m.s=cstr;
i_only_read(&m);
}
注意事项
const char* s
,因为大多数采用指向结构的指针的函数都会修改 s
。char* s
,一个是const char* s
,但这看起来很丑(创建冗余,需要转换函数在两个结构之间)。struct attr
。我为这个问题创建了一个简单的示例。最佳答案
有趣的是,您似乎可以在 union
中执行此操作:
struct mystruct {
int i;
union {
char *s;
const char *cs;
};
};
现在,适用于 union
的规则:仅使用分配给的 union 成员。如果函数“ promise ”运行,您可以将字符串分配给 cs
而不会发出警告。
具体来说,您不应该做的是分配给 cs
,然后将结构作为非常量参数传递。
关于c - 具有成员的结构有时需要是“const”,有时不需要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18068372/
我是一名优秀的程序员,十分优秀!