gpt4 book ai didi

c - 具有成员的结构有时需要是“const”,有时不需要

转载 作者:太空狗 更新时间:2023-10-29 15:58:35 25 4
gpt4 key购买 nike

我正在开发一个程序,该程序在许多地方使用通用 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);
}

注意事项

  1. 我无法将结构的声明更改为 const char* s,因为大多数采用指向结构的指针的函数都会修改 s
  2. 我想我可以有两个结构,一个是char* s,一个是const char* s,但这看起来很丑(创建冗余,需要转换函数在两个结构之间)。
  3. 如果有人感兴趣,程序是Navit ,该结构是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com