关于GNU dd中fdatasync宏与C表达式求值顺序的疑问
关于GNU dd中
fdatasync宏返回值的疑问解答 首先要区分两种完全不同的场景:函数多参数的求值顺序属于未定义行为,但逗号运算符的求值逻辑是C标准明确规定的。
你提到的宏#define fdatasync(fd) (errno = ENOSYS, -1)用到了C语言的逗号运算符,它的执行规则非常明确:
- 先执行左侧表达式
errno = ENOSYS,完成对errno的赋值操作 - 再执行右侧表达式
-1,并将这个值作为整个逗号表达式的返回结果
这和printf("%d, %d\n", i++, i++)的情况本质不同:后者是函数多个实参的求值顺序,C标准没有强制规定参数的求值顺序,所以属于未定义行为;而逗号运算符是单个表达式内部的操作,C标准要求必须从左到右依次求值,且返回最右侧表达式的值。
因此GNU dd的开发者可以完全确定这个宏最终返回的是-1,同时完成errno的赋值,这是符合C标准定义的确定行为,不存在不确定性。
内容的提问来源于stack exchange,提问作者gitman-2021
相关产品推荐
相关产品推荐

