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

标签 c

*编辑 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/

相关文章:

c - 在为微 Controller 编译 C 程序时,编译器放置的那些额外的汇编代码是什么?

c - 在 C 中对二维字符串数组进行排序

c++ - 锁定sqlite3 db以进行文件下载

c - 为什么第 33791 个素数 (399137) 会导致 Segmentation Fault?

c - 如果输入很大,程序会异常终止

c - 扫描一个大的十六进制值

c - if 语句忽略零?

c++ - 在函数实现中强制执行注释

c - C中的二进制搜索,递归函数只接受长度

c++ - 在 C 和 C++ 中使用 const 限定符指向数组的指针