谁能解释一下uboot中的这行代码

wgzymzx 2010-09-06 08:45:51
int cmd_items = &__u_boot_cmd_end -
&__u_boot_cmd_start; /* pointer arith! */

为什么这样cmd_items就得到了命令得个数?
...全文
159 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
foochow 2010-09-23
  • 打赏
  • 举报
回复
C语言基础不过关
ask_qianru 2010-09-20
  • 打赏
  • 举报
回复
嘿嘿,问题的关键就是,相减的时候,编译器是按照“类型”来减的,这个帖子真有意思!反应了C编译器的强大。
hardbeyond 2010-09-17
  • 打赏
  • 举报
回复
受教,谢谢
frank529 2010-09-17
  • 打赏
  • 举报
回复
/* pointer arith! */ 指针算术
yuekejun 2010-09-15
  • 打赏
  • 举报
回复
受教,谢谢
coding码场 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 wgzymzx 的回复:]
int cmd_items = &__u_boot_cmd_end -
&__u_boot_cmd_start; /* pointer arith! */

为什么这样cmd_items就得到了命令得个数?
[/Quote]这两个指针的相减不等于内存地址的偏移量,而是指针对象的个数。
coding码场 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wgzymzx 的回复:]
明白了,感觉应该是操作符被重载过,没时间看编译器原理。
暂这样理解吧,呵呵。
[/Quote]有没有搞错哦,uboot里的代码还“感觉应该是操作符被重载过”。
tankdin 2010-09-09
  • 打赏
  • 举报
回复
引用相减本来就是要除以sizeof(type)的...
这是常识啊。
所以你的问题得到的就是几条指令,因为无论如何是要除以指令长度的。
tosail 2010-09-09
  • 打赏
  • 举报
回复
你把结构体初始化一下,在看看。
yuekejun 2010-09-07
  • 打赏
  • 举报
回复
好贴,学习了
bluesea87 2010-09-06
  • 打赏
  • 举报
回复
应该是那样的,因为两个都指针类型的,预算的时候就会按照指针运算
wgzymzx 2010-09-06
  • 打赏
  • 举报
回复
明白了,感觉应该是操作符被重载过,没时间看编译器原理。
暂这样理解吧,呵呵。
wgzymzx 2010-09-06
  • 打赏
  • 举报
回复
切,你有仔细看过uboot的源代码没有哟,要是这么简单,我也看出来了。
struct SS
{
char *name;
int index;
};

struct SS ss[10];

int main()
{

printf("%d %d %d\n", &ss[10], &ss[0], &ss[10] - &ss[0]);

system("pause");
return 0;
}
这个例子,你仔细看看,是一个字节吗?
我编译之后运行的结果是&ss[10]=4210784, &ss[0]=4210704。
而最后结果是 10。
分析来看,应该是编译器自动将两个地址的值除了SS的结构大小,所以结果才是这样。
uboot的代码也是基于这个原来来计算命令个数的。
coding码场 2010-09-06
  • 打赏
  • 举报
回复
这种首尾地址相减,就可以知道中间占了多少内存空间,每个CMD占一个字节,这样一减不就知道items了嘛。

21,600

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧