如何解决如何在一行中避免“左值需要为一元‘&’”错误?
我知道如何简单地避免 lvalue required as unary ‘&’
错误(如 here)
我尝试做的是避免在一行中出现此错误。 为什么?我定义了很多常量,并且在我正在处理的写得很糟糕的代码的几个部分中,这个常量用于初始化。不想每次使用都定义一个中间变量...
在下面的例子中,我需要中间值 't'
int * p;
const int q = 88;
int t = (int)q; //works but I have to add for each time I used q,an intermediate variable.
p = &t;
printf("p: %u\n",*p);
在下面的例子中,我不需要中间值“t”(但它不起作用)
int * p;
const int q = 88;
p = &((int)q); //what I would like to do but raises: error: lvalue required as unary ‘&’ operand
printf("p: %u\n",*p);
有单线方式吗? 使用 #defines 可能是一个提示...
注意:我非常不希望在我的编译中出现任何警告,因为我正在纠正 MISRA 违规行为:
Cast from 'const int *' removes 'const' qualifier (MISRAC2012-RULE_11_8.a)
注意:p 没有声明为 const int,因为 p 是后来修改的。 p 使用 i 初始化自身。
如果变量很简单,'StoryTeller - Unslander Monica' 给出的解决方案是有效的:p = &((int){i});
但是这不适用于结构:
typedef struct
{
int i;
int j;
}struct_t;
const struct_t q = {.i=12,.j=88};
printf("q: %u - %u\n",q.i,q.j);
struct_t * p = &((struct_t){q});
printf("p: %u - %u\n",p->i,p->j);
其中的编译引发了 error: incompatible types when initializing type ‘int’ using type ‘struct_t {aka const struct }’
解决方法
像 (int)i
这样的强制转换表达式确实不是左值。但是,compound literal 是一个左值:
p = &(int){i};
它本质上产生一个匿名整数,具有自动存储持续时间,从 i
初始化,并持续到封闭范围结束。
所以你也得到了一个有效的指针。
使用结构稍微改变了竞争环境。由于初始化列表的语义在标量和聚合之间有所不同。但这并不意味着我们不能以统一的方式工作。只需创建一个数组(包含 1 个元素),所以我们总是初始化一个封闭的聚合。现在两个代码片段都可以工作
// p = (int[]){i};
struct_t *p = (struct_t[]){q};
尽管转换为指针是隐式的(这可能会引发争论)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。