【发布时间】:2013-08-05 21:49:05
【问题描述】:
我正在开发一个程序,该程序在许多地方使用通用 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);
}
备注
- 我无法将结构的声明更改为
const char* s,因为大多数采用指向结构的指针的函数都会修改s。 - 我想我可以有两个结构,一个是
char* s,一个是const char* s,但这看起来很丑(造成冗余,需要两个结构之间的转换函数)。 - 如果有人感兴趣,程序是Navit,结构是
struct attr。我为这个问题创建了一个简单的示例。
【问题讨论】:
-
+1 我正在实现一个通用字符串对象,它可以在复制或不复制的情况下进行初始化,我也遇到了这个问题。我很高兴你问这个。
-
@H2CO3:呃,没关系:-S
-
@KerrekSB 没问题 - 如果从
const char *到(char *)的 C 风格转换也是安全的,我会很乐意使用它 :)