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

问一个简单的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[];

分析很透彻,现在理解了,赞一个
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版