OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3591|回复: 7

C语言中字符数组初始化的疑问

[复制链接]

15

主题

50

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
322
金钱
322
注册时间
2014-10-29
在线时间
37 小时
发表于 2016-7-28 16:20:41 | 显示全部楼层 |阅读模式
1金钱
最近在分析uboot源代码,其中在字符数组初始化的一些知识上存在欠缺,下面是我遇到的问题描述:
在uboot的board.c文件中有这样的字符数组定义
const char version_string[] =
        U_BOOT_VERSION" (" __DATE__ " - " __TIME__ ")"CONFIG_IDENT_STRING;

上面的 U_BOOT_VERSION   定义是:#define   U_BOOT_VERSION   "U-Boot 1.1.6"
          CONFIG_IDENT_STRING  定义是:define   CONFIG_IDENT_STRING   ""

问题:上面的字符数组在预编译后是否为:const char version_string[] = "U-Boot 1.1.6"" (" __DATE__ " - " __TIME__ ")""";
如果预编译后是上面的字符,请给出这种初始化的分析与解释。谢谢,我在网上查了很久,没有找到。
注意:采用的编译器是交叉编译器 arm-linux-gcc  4.3.2


放在arm9板块两天了没有人浏览,所以放到这里,大家讨论下,谢谢。

最佳答案

查看完整内容[请看2#楼]

两个连续的双引号会自动忽略,两个双引号都会消失; 而__DATE__的双引号将直接把__DATE__这类字符串宏定义的值替换到字符串中,而不是宏定义本身的字符, __DATE__直接替换为编译时电脑上的日期(__DATE__等同于 “ Jul 28 2016”); 换句话说,假设你编译的时间是2016年7月28日 17点30分00秒,那这个字符串等价于: const char version_string[] = "U-Boot 1.1.6 (Jul 28 2016 - 17:30:00)"; (日期时间格式可能不太一样) ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2016-7-28 16:20:42 | 显示全部楼层
本帖最后由 ianhom 于 2016-7-28 19:14 编辑

两个连续的双引号会自动忽略,两个双引号都会消失;
而__DATE__的双引号将直接把__DATE__这类字符串宏定义的值替换到字符串中,而不是宏定义本身的字符,  __DATE__直接替换为编译时电脑上的日期(__DATE__等同于 “ Jul 28 2016”);
换句话说,假设你编译的时间是2016年7月28日 17点30分00秒,那这个字符串等价于:
const char version_string[] = "U-Boot 1.1.6 (Jul 28 2016 - 17:30:00)";   (日期时间格式可能不太一样)
QQ截图20160728184242.png
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

5

主题

150

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2015-12-28
在线时间
132 小时
发表于 2016-7-28 16:41:03 | 显示全部楼层
不会,太狠了!
精神支持!
越努力,越优秀;越独立,越自由
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
发表于 2016-7-28 18:45:01 | 显示全部楼层
ianhom 发表于 2016-7-28 17:50
两个连续的双引号会自动忽略,两个双引号都会消失;
而宏定义的双引号将直接把宏定义的值替换到字符串中, ...

又看到大神了,我是来围观你的
电子爱好者
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2016-7-28 18:49:48 | 显示全部楼层
liuchang 发表于 2016-7-28 18:45
又看到大神了,我是来围观你的

坛子里真大神太多,我是来潜水学习的
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

5

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2014-11-26
在线时间
25 小时
发表于 2016-7-29 10:14:52 | 显示全部楼层
在C语言中  "aa" "bb" 两个字符串中间没有其他东西   空白符除外   编译器会把他们自动连接在一起,这样理解的话,其他应该不用多说了
回复

使用道具 举报

15

主题

50

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
322
金钱
322
注册时间
2014-10-29
在线时间
37 小时
 楼主| 发表于 2016-7-29 14:37:38 | 显示全部楼层
谢谢了 ianhom   这个困扰解决了  这个知识点很不错。像这种初始化在uboot代码中还有几个地方也用到了,例如:默认环境变量的数组。
回复

使用道具 举报

15

主题

50

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
322
金钱
322
注册时间
2014-10-29
在线时间
37 小时
 楼主| 发表于 2016-7-29 14:59:07 | 显示全部楼层
另外在补充一下:2楼的方法提醒了我,像这种C语言知识点,不懂了完全可以放在VC++里面调试一下,可能平台不一样会存在差异(但是都符合C标准)。
我刚才调试了一下,完全正确。

代码

代码

调试信息

调试信息
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 22:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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