检测C中的表达式是左值还是右值

检测C中的表达式是左值还是右值,c,C,有没有办法确定给定的表达式在C中是左值还是右值?例如,是否存在具有以下行为的函数或宏is_lvalue: int four() { return 4; } int a = 4; /* Returns true */ is_lvalue(a); /* Returns false */ is_lvalue(four()); 我知道等效的功能,但在任何C标准中都有这样做的方法吗?我对特定于GCC的扩展不是特别感兴趣 谢谢您的时间。C标准没有提供任何检测表达式是否为左值的方法,根据操作数

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

int four() {
    return 4;
}

int a = 4;

/* Returns true */
is_lvalue(a);

/* Returns false */
is_lvalue(four());
我知道等效的功能,但在任何C标准中都有这样做的方法吗?我对特定于GCC的扩展不是特别感兴趣


谢谢您的时间。

C标准没有提供任何检测表达式是否为左值的方法,根据操作数是否为左值,使某些操作具有不同的值,或者根据操作数是否为左值,生成转换时诊断消息或错误

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


在严格一致性C中,最接近的一个方法是尝试使用运算符
&
的地址获取表达式的地址。如果操作数不是左值,这将产生一条诊断消息(在典型的C实现中是一个错误)。但是,它还将为位字段或用
寄存器声明的左值生成消息。如果这些被排除在感兴趣的情况之外,那么在程序翻译过程中,它可能有助于区分左值和非左值。

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