LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1606|回复: 7

FC5下gcc编译时出现赋值运算中的左值无效的错误

[复制链接]
发表于 2006-8-9 17:00:42 | 显示全部楼层 |阅读模式
请问哪位兄弟知道这个问题怎么来解决?
同样的代码在FC3下只是警告。
发表于 2006-8-9 17:09:53 | 显示全部楼层
晕,连代码都不贴,你让人家怎么帮你?这世界上没多少神仙的……
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-8-9 19:13:52 | 显示全部楼层
像如下代码编译就会出现这个错误:
fb_writeb(d3, ((__u16*)dest32)++);

若改成下面两行就没问题:
__u16 *temp = (__u16*)dest32;
fb_writeb(d3, temp++);

为何?
回复 支持 反对

使用道具 举报

发表于 2006-8-9 19:54:04 | 显示全部楼层
how is dest32 defined? is it a variable or a const value?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-8-9 21:05:32 | 显示全部楼层
Post by DoDo
how is dest32 defined? is it a variable or a const value?


the dest32 is defined like this:
   __u32* dest32;

it's not a const value.
回复 支持 反对

使用道具 举报

发表于 2006-8-9 22:23:25 | 显示全部楼层
  1. (__u16*)dest32)++;
复制代码
means
  1. __u16 *temp = (__u16*)dest32;
  2. temp++;
  3. dest32 = temp;
复制代码
and
  1. dest32)++;
复制代码
means
  1. __u16 *temp = (__u16*)dest32;
  2. temp += sizeof(__u32) / sizeof(__u16); /* maybe 2 */
  3. dest32 = temp;
复制代码
指针是一种特殊的数据类型, 它的取值是有一定限制的, 比如一个32位类型的指针其最低2位应该为零,也就是说它应该是4的倍数. 那么对这种指针执行++操作会怎样呢?
  1. #include <stdio.h>
  2. int main()
  3. {
  4.         int x;
  5.         int * p = &x;
  6.         printf("p = %X\n", p);
  7.         printf("++p = %X\n", ++p);
  8.         return 0;
  9. }
复制代码
运行结果
  1. rf@RemoteFish:~/shm$ ./a.out
  2. p = BFDCE74C
  3. ++p = BFDCE750
复制代码
这样说楼主大概就能明白自己的问题出在哪里了吧. 不过, 也许特定的编译参数可以解决这种问题.

我的剖析完全为自己的想法, 并没有严格的理论凭证, 欢迎各位仁兄指出在下的错误
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-8-15 10:17:44 | 显示全部楼层
DoDo所言确是,但我觉得此问题的关键不在“++”这个操作本身, 而是变量类型转换后作为左值的问题。
回复 支持 反对

使用道具 举报

发表于 2006-8-15 16:43:44 | 显示全部楼层
++本身当然没错, 但是不同的数据指针其++操作的含义是不同的, 也正是这种区别最终导致了楼主的问题
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表