我正在研究一个程序,它struct
在许多地方使用泛型来绕过相关的值.该结构包含一个字段char* s
.
许多功能修改s
; 但是,有时结构用于将信息传递给只读取它的函数.在这些情况下,用于初始化的字符串通常s
是a const char*
.但是,将其分配会s
导致编译器警告.
虽然技术上是正确的,但这个警告感觉不对,因为该功能不会修改s
.有没有办法绕过这个警告,除了扔掉const?有没有办法让函数承诺它会将struct成员视为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);
}
Run Code Online (Sandbox Code Playgroud)
笔记
const char* s
,因为大多数指向结构的函数都会修改s
.char* s
一个带const char* s
,但是看起来非常难看(创建冗余,需要两个结构之间的转换功能).struct attr
.我为这个问题创建了一个简单的例子.有趣的是,你似乎能够在以下方面做到这一点union
:
struct mystruct {
int i;
union {
char *s;
const char *cs;
};
};
Run Code Online (Sandbox Code Playgroud)
现在,union
apply 的规则:仅使用分配给的union成员.如果函数'promises'表现出来,您可以在cs
不发出警告的情况下将字符串分配给.
具体来说,你应该不会做的是分配给cs
,然后通过结构作为一个非const参数.