考虑以下宏:
#define FOO(a,b) (--a)* 8 + (--b);
现在
int graph[8][8] = { 0 };
int *graph_p = &(graph[0][0]);
int *p = graph_p + FOO(2, 3);
为什么我会收到错误:
IntelliSense:表达式必须是可修改的左值
答案 0 :(得分:2)
该行
int *p = graph_p + FOO(2, 3);
将在编译时被定义的宏替换为
int *p = graph_p + (--2)* 8 + (--3);;
前缀--
的操作数必须是左值。 2
和3
是整数常量,它不能是前缀--
运算符的操作数。
答案 1 :(得分:2)
这是因为您将整数常量传递给类似函数的宏FOO(a, b)
,它将预增量--
运算符应用于其参数。
此宏扩展的结果如下:
int *p = graph_p + (--2)* 8 + (--3);;
在C中是非法的,因为运算符需要可修改的左值作为其操作数。
这里的另一个问题是,您应该在宏的替换周围放置parantheses而不要在末尾放置分号:
#define FOO(a,b) ((--a)* 8 + (--b))
答案 2 :(得分:1)
FOO(2,3)
转换为(--2)* 8 + (--3)
您只能增加/减少左值,而不是数字。
答案 3 :(得分:1)
试试这个:
Int * p=(int * )(graph-p+FOO(2,3));