【问题标题】:C: error C2105: '++' needs lvalueC: 错误 C2105: '++' 需要左值
【发布时间】:2014-12-20 14:19:07
【问题描述】:
Windows、MSVS 2010。
我无法理解为什么会产生编译错误:
#define INC(X) X++
int main() {
int X;
printf("%d", INC(X++));
return 0;
}
错误:
错误 1 错误 C2105: '++' 需要
l-value testing.cpp 19 1 测试
【问题讨论】:
标签:
c
compiler-errors
macros
【解决方案1】:
扩展宏的结果是X++++。
后缀++ 运算符将变量的值递增并返回递增前的值。它不返回左值(变量) - 只是一个值。你不能对它应用++,就像你不能调用3++一样。
【解决方案2】:
类似的宏定义
INC(X++)
与
相同
X++++
也就是说,(根据贪婪的编译器规则)(X++)++。
请记住,#define 宏不是函数调用,而是在预处理阶段发生的文本替换,因此,从本质上讲,您的代码看起来像 (5++)++,这是无效的,因为可以使用递增/递减运算符变量 [lvalue],而不是值本身(非左值)。
注意:你可以增加一个变量所持有的值。你不能增加一个值本身。
这里,X 不是变量。作为 MACRO 扩展的一部分,它在预处理时替换为 5。
总而言之,你不能做像5++这样的事情,就像将5增加1并将其存储到5。
【解决方案3】:
INC(X++)
扩展到
X++++
也就是说,
(X++)++
...而X++ 不是左值,所以不能自增。