gpt4 book ai didi

c - 分配相同类型的值将不起作用(需要左值作为一元 '&' 操作数)

转载 作者:行者123 更新时间:2023-12-02 04:40:39 26 4
gpt4 key购买 nike

在第一个文件中,我有以下代码

JMP_BUF *t;

t = xalloc(sizeof(jmp_buf));

thread_recovery_context = t;

两个文件的共同点是头文件

extern JMP_BUF *thread_recovery_context;

第三个文件有

JMP_BUF long_eval_recovery_context, *thread_recovery_context;

那么,当它们是相同的类型时,为什么这会导致错误“左值需要作为一元‘&’操作数”?添加所述运算符并不能安抚它。

*编辑

实际上,我把它缩写了,因为我认为其余的代码并不重要,但整行是

switch(eval_round = SETJMP1(thread_recovery_context = t)) {

确实,当我将它缩减为 thread_recovery_context = t 时,它会起作用。

但是,行

switch(eval_round = SETJMP1(thread_recovery_context)) {

也构建得很好。

什么给了?

*编辑

似乎如果我将 SETJMP1 更改为 setjmp,它构建起来就很好了!尽管前者等同于后者。有人知道为什么会这样吗?

*编辑我可以通过将表达式移到单独的行来解决该问题。但出于好奇,我仍然想知道为什么它在宏内部不起作用。

最佳答案

顺便说一句:(从评论升级,因为这是正确的答案)

我不知道 JMP_BUF/SETJMP1() 是什么,但如果它是宏,则解析为 jmp_buf: the return value from setjmp() cannot be assigned ,仅经过测试。 (这是针对标准 C 的,如果不是:请相应地标记您的问题)

背景:setjmp/longjmp() 中涉及的机制会对堆栈做一些令人讨厌的事情(如果体系结构将堆栈用于自动变量),如果您使用 setjmp( ) 在作业中。所以:

switch(eval_round = setjmp(thread_recovery_context)) { ...}

不正确,而

switch(setjmp(thread_recovery_context)) {...}

是正确的。 (这里假设 #define SETJMP1(j) setjmp(j) 是 SETJMP1() 的定义)。在场景中添加 theading 会使情况变得更糟。


更新:另一个潜在的问题可能是对宏SETJMP1()function-style 参数的求值:

switch( SETJMP1(thread_recovery_context = t)) { ...}

,如果 SETJMP1() 对其参数求值不止一次,它可能会做一些丑陋的事情,例如当 SETJMP1() 定义如下时:

#define SETJMP1(j) (j) ? setjmp(j) : -1

但这一切都取决于宏的定义,显然...

关于c - 分配相同类型的值将不起作用(需要左值作为一元 '&' 操作数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20874009/

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