【问题标题】:Detecting if expression is lvalue or rvalue in C检测表达式是C中的左值还是右值
【发布时间】:2020-11-06 10:30:25
【问题描述】:

有什么方法可以确定给定的表达式是 C 中的左值还是右值?例如,是否存在具有以下行为的函数或宏 is_lvalue

int four() {
    return 4;
}

int a = 4;

/* Returns true */
is_lvalue(a);

/* Returns false */
is_lvalue(four());

我知道 exists in C++ 的等效功能,但是在任何 C 标准中都有什么方法可以做到这一点?我对 GCC 特定的扩展不是特别感兴趣。

感谢您的宝贵时间。

【问题讨论】:

  • 不,没有这样的运气。左值相关的上下文数量非常有限。准确地说,这些正是sizeofalignof、一元&++--. 的操作数。这些都不能用来区分左值和右值。
  • & 可用于生成编译时错误,如果这足够好的话。

标签: c


【解决方案1】:

C 标准没有提供任何方法来检测表达式是否为左值,要么通过根据操作数是否为左值而使某些操作具有不同的值,要么通过生成翻译时诊断消息或错误取决于操作数是否为左值。

C 实现当然可以定义提供此功能的扩展。

关于严格符合 C 的最接近的方法是尝试使用地址运算符 & 获取表达式的地址。如果它的操作数不是左值,这将产生一个诊断消息(并且,在典型的 C 实现中,一个错误)。但是,它也会为作为位域或使用register 声明的左值生成一条消息。如果这些被排除在感兴趣的案例之外,那么它可能有助于在程序翻译期间区分左值和非左值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多