Chinaunix首页 | 论坛 | 博客
  • 博客访问: 266198
  • 博文数量: 34
  • 博客积分: 903
  • 博客等级: 准尉
  • 技术积分: 428
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-31 10:23
文章分类

全部博文(34)

文章存档

2012年(3)

2011年(31)

我的朋友

分类: LINUX

2011-08-31 10:36:29

在UBOOT当中,各个命令是通过U_BOOT_CMD这个宏来定义出来的,其本质其实理解起来也很简单,不过今天也从中学到了一点东西

 

先来看UBOOT当中关于U_BOOT_CMD这个宏的定义:

 

/* 这是定义一个结构的属性,将其放在.u_boot_cmd这个段当中,相当于.data/.bss这些段 */

#define Struct_Section  __attribute__ ((unused,section (".u_boot_cmd")))

 

/* 宏定义,用于定义一个命令 */
#define U_BOOT_CMD(name,maxargs,rep,cmd,usage) /
  cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage}

 

这样一来,凡通过U_BOOT_CMD定义的cmd_tbl_t变量会全部被放在.u_boot_cmd段当中(可以看UBOOT的链接脚本xxx.lds),具体怎么放是链接器的工作。

 

这里要看的是##name和#name这两个操作.##name将字符直接跟在后面, #name会将name这个字符中以“..."的形式放置。

 

例如:定义一个命令boot

U_BOOT_CMD(boot, 0, 0, fun, "boot xxx");


展开以后会变成:

cmd_tbl_t __u_boot_cmd_boot __attribute___((unused, section(".u_boot_cmd"))) = {"boot", 0, 0, fun, "boot xxx"}

 

大部分基本不变,将Struct_Section展开了,还将##name换成了boot, 将#name换成了"boot"。应该不难看出##/#的作用吧。

 

从上面来看,我们是不是可以在程序运行时去定义一个变量呢??我们可以通过##xxx来定义一个变量,然后还可以通过这种形式来使用它。有兴趣研究一下,今天先到这里吧

 

 

前两天和同事讨论这个#的问题,同事说这个东西是标准C的东西,不是GCC特有的,突然觉得自己连这个都不知道,真是...,还得好好学习啊

阅读(3330) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~