*编辑 xalloc 相当于 malloc,JMP_BUF 定义为 jmp_buf,如果 posix 环境,则 SETJMP1 定义为 sigsetjmp,如果不是,则定义为 setjmp。
在第一个文件中,我有以下代码
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: setjmp() 的返回值 无法赋值 ,仅测试。 (这是针对标准 C 的,如果不是:请相应地标记您的问题)
背景:setjmp/longjmp() 涉及的机制对堆栈做了一些令人讨厌的事情(如果架构使用堆栈作为自动变量),如果您使用 setjmp( 的返回值,则导致(实现定义或)未定义的行为)在作业中。所以:
switch(eval_round = setjmp(thread_recovery_context)) { ...}
不正确,而
switch(setjmp(thread_recovery_context)) {...}
是正确的。 (假设 #define SETJMP1(j) setjmp(j)
是 SETJMP1() 的定义)。在场景中添加主题会使情况变得更糟。
更新:另一个潜在问题可能是宏 SETJMP1()
的函数式参数的求值:
switch( SETJMP1(thread_recovery_context = t)) { ...}
,如果 SETJMP1()
多次计算其参数,例如当 SETJMP1() 定义如下时,它可能会做出丑陋的事情:
#define SETJMP1(j) (j) ? setjmp(j) : -1
但这一切都取决于宏的定义,显然......
关于c - 分配相同类型的值不起作用(需要左值作为一元 '&' 操作数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20874009/