你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

问一个简单的C语言字符串数组外部引用的问题

[复制链接]
wdshuang09 提问时间:2016-11-5 19:50 /
file1.c 定义一个u8 RTC_SET[]="The First Time Set RTC Timer";并在file1.h中extern u8 RTC_SET[];           在file1.c中引用uart1_senddata(RTC_SET,sizeof(RTC_SET));正常

但在file2.c (包含file1.h),此时引用uart1_senddata(RTC_SET,sizeof(RTC_SET));编译通不过;问题出在sizeof(RTC_SET)中,

讨论:要用指针怎么引用,一般在file2.c引用file1.c中的字符串数组是怎么操作的?

收藏 1 评论12 发布时间:2016-11-5 19:50

举报

12个回答
moyanming2013 回答时间:2016-11-7 10:43:06
本帖最后由 moyanming2013 于 2016-11-7 10:50 编辑

头文件的作用之一就是不暴露其中定义的细节。
头文件中对于如下声明:
extern u8 RTC_SET[];
来说,包含它而未定义它的c文件不知道具体它的定义是如何的(人看起来是数组,编译器其实只知道RTC_SET是个指针),所以你用sizeof也就基本是“错误”的用法。如果指定了其数组大小,那么含有它的c文件就非常明确的知道其为数组和它的值,就可以使用sizeof。
但你又想能够让函数自动获取RTC_SET的字符串大小,这里有个解决方法就是:
uart1_sendData(RTC_SET,strlen(RTC_SET));
优点:不需要特殊记录RTC_SET的大小,可以任意扩展该字符串。程序可维护性、可扩展性较好。
缺点:RTC_SET需要是C格式的字符串,就是以0x00结尾的字符串,这是strlen的限制导致的。再就是strlen比sizeof耗时、耗空间(整个程序只有此一处使用时)都比较多。

strlen参考:
http://en.cppreference.com/w/c/string/byte/strlen
任风吹吹 回答时间:2016-11-5 20:28:33
你换一种定义方式,u8 RTC_SET[28]="....";,然后extern u8 RTC_SET[28];就可以了
peter001 回答时间:2016-11-5 20:30:37
extern u8 RTC_SET[];  放在C文件里
笑鸟007 回答时间:2016-11-5 21:09:33
extern u8 RTC_SET[]; 放在file2.c里面
wdshuang09 回答时间:2016-11-6 08:13:53
任风吹吹 发表于 2016-11-5 20:28
你换一种定义方式,u8 RTC_SET[28]="....";,然后extern u8 RTC_SET[28];就可以了

这种方法可以
wdshuang09 回答时间:2016-11-6 08:14:22
peter001 发表于 2016-11-5 20:30
extern u8 RTC_SET[];  放在C文件里

不行,我试过编译通不过
zfz9232 回答时间:2016-11-6 10:39:22
mark...jiayou
anobodykey 回答时间:2016-11-7 09:44:14
wdshuang09 回答时间:2016-11-7 12:17:45
moyanming2013 发表于 2016-11-7 10:43
头文件的作用之一就是不暴露其中定义的细节。
头文件中对于如下声明:
extern u8 RTC_SET[];

分析很透彻,现在理解了,赞一个
高二毛 回答时间:2016-11-7 14:04:14
C语言声明和定义的问题
忘记一切Q 回答时间:2016-11-7 16:36:39
zbber 回答时间:2016-11-7 18:13:35
extern u8 RTC_SET[]; 放在file2

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版