我正在开发一个程序,该程序struct
在许多地方使用泛型来遍历相关值。该结构包含一个字段char* s
。
许多功能修改s
;但是,有时该结构用于将信息传递给只会读取它的函数。在这些情况下,用于初始化的字符串通常s
是const char*
. 但是,将其分配给s
会导致编译器警告。
虽然在技术上是正确的,但这个警告感觉不对,因为函数没有修改s
. 除了丢弃 const 之外,有没有办法绕过这个警告?函数是否有某种方式可以保证它将结构成员视为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);
}
笔记
- 我无法将 struct 的声明更改为
const char* s
,因为大多数采用指向 struct 的指针的函数都会修改s
。 - 我想我可以有两个结构,一个 with
char* s
和一个 withconst char* s
,但这看起来很丑陋(创建冗余,需要两个结构之间的转换函数)。 - 如果有人对该程序感兴趣Navit,则结构是
struct attr
. 我为这个问题创建了一个简单的例子。