gpt4 book ai didi

c - &errno 是合法的 C 语言吗?

转载 作者:太空狗 更新时间:2023-10-29 16:18:44 26 4
gpt4 key购买 nike

根据 7.5,

[errno] expands to a modifiable lvalue175) that has type int, the value of which is set to a positive error number by several library functions. It is unspecified whether errno is a macro or an identifier declared with external linkage. If a macro definition is suppressed in order to access an actual object, or a program defines an identifier with the name errno, the behavior is undefined.

175) The macro errno need not be the identifier of an object. It might expand to a modifiable lvalue resulting from a function call (for example, *errno()).

我不清楚这是否足以要求 &errno 不违反约束。 C 语言有左值(例如寄存器存储类变量;但是这些只能是自动的,所以 errno 不能这样定义),& 运算符是违反约束条件。

如果&errno是合法的C,是否要求它是常量?

最佳答案

因此 §6.5.3.2p1 指定

The operand of the unary & operator shall be either a function designator, the result of a [] or unary * operator, or an lvalue that designates an object that is not a bit-field and is not declared with the register storage-class specifier.

认为可以理解为 &lvalue 适用于不属于这两个类别的任何左值。正如你提到的,errno 不能用寄存器存储类说明符声明,我认为(虽然我现在不追逐引用来检查)你不能有一个类型为普通 < strong>int.

所以我相信规范要求 &(errno) 是合法的 C。

If &errno is legal C, is it required to be constant?

据我所知,允许 errno 成为一个宏(以及它在 glibc 中的原因)的部分目的是允许它成为对线程本地存储的引用,在这种情况下,它肯定不会跨线程保持不变。而且我看不出有任何理由期望它必须保持不变。只要 errno 的值保留指定的语义,我认为一个不正当的 C 库没有理由不能更改 &errno 以在程序过程中引用不同的内存地址-- 例如通过在每次设置 errno 时释放和重新分配后备存储。

您可以想象维护一个由库设置的最后 N 个 errno 值的环形缓冲区,并让 &errno 始终指向最新的。我认为它不会特别有用,但我看不出它有任何违反规范的地方。

关于c - &errno 是合法的 C 语言吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12945486/

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