[开发工具] MDK下新的编程习惯,和大家分享一下、、、、

[复制链接]
 楼主| xlsbz 发表于 2014-11-16 10:38 | 显示全部楼层 |阅读模式
比如 以前写

uint8_t   tmp[] = {0,1,2,3,4,5,6,7,8};

在MDK下 最好写成 uint8_t   tmp[9] = {0,1,2,3,4,5,6,7,8};

还有 在一个文件下定义 __IO   t = 0;
另一个文件下,可以定义为只读或只写  extern __I  t;

还有sizeof这个用的时候要谨慎 在KEIL51编译器要注意。
LOVE_ELEC 发表于 2014-11-16 11:42 | 显示全部楼层
楼主,可以阐述下详细的理由!
adce 发表于 2014-11-16 12:17 | 显示全部楼层
1.愿闻其区别...
2.
core_cm4.h
#ifdef __cplusplus
  #define   __I     volatile             /*!< Defines 'read only' permissions                 */
#else
  #define   __I     volatile const       /*!< Defines 'read only' permissions                 */
#endif
#define     __O     volatile             /*!< Defines 'write only' permissions                */
#define     __IO    volatile             /*!< Defines 'read / write' permissions              */
3.sizeof(var)/sizeof(int)
mmuuss586 发表于 2014-11-16 13:19 | 显示全部楼层

谢谢楼主分享;
sedatefire 发表于 2014-11-16 19:34 | 显示全部楼层
这个,从编译角度上讲,其实没什么差异
只是早期的编译器可能编译不过。
sxhhhjicbb 发表于 2014-11-16 19:45 | 显示全部楼层
uint8_t   tmp[] = {0,1,2,3,4,5,6,7,8};

在MDK下 最好写成 uint8_t   tmp[9] = {0,1,2,3,4,5,6,7,8};

愿闻其详
icecut 发表于 2014-11-16 19:50 | 显示全部楼层
fanxsd 发表于 2014-11-16 19:54 | 显示全部楼层
这是要啥意思呢!求解答!
 楼主| xlsbz 发表于 2014-11-16 19:58 来自手机 | 显示全部楼层
sxhhhjicbb 发表于 2014-11-16 19:45
uint8_t   tmp[] = {0,1,2,3,4,5,6,7,8};

在MDK下 最好写成 uint8_t   tmp[9] = {0,1,2,3,4,5,6,7,8};

哦。那个mdk检查边界啊。我说的对吧??
 楼主| xlsbz 发表于 2014-11-16 20:00 来自手机 | 显示全部楼层
sxhhhjicbb 发表于 2014-11-16 19:45
uint8_t   tmp[] = {0,1,2,3,4,5,6,7,8};

在MDK下 最好写成 uint8_t   tmp[9] = {0,1,2,3,4,5,6,7,8};

这2种,tmp[18]报错。
 楼主| xlsbz 发表于 2014-11-16 20:15 | 显示全部楼层
icecut 发表于 2014-11-16 19:50

uint8_t   tmp[] = {0,1,2,3,4,5,6,7,8};

/* Private functions -------------------------*/
int main(void)
{
tmp[18] = 0;
===============
..\user\main.c(112): warning:  #175-D: subscript out of range
 楼主| xlsbz 发表于 2014-11-16 20:16 | 显示全部楼层
uint8_t   tmp[20] = {0,1,2,3,4,5,6,7,8};

/* Private functions -------------------------*/
int main(void)
{
tmp[18] = 0;
=====================
".\OBJ\firmware.axf" - 0 Error(s), 0 Warning(s).
 楼主| xlsbz 发表于 2014-11-16 20:16 | 显示全部楼层
难道大家没发现 那么??



 楼主| xlsbz 发表于 2014-11-16 20:18 | 显示全部楼层
sedatefire 发表于 2014-11-16 19:34
这个,从编译角度上讲,其实没什么差异
只是早期的编译器可能编译不过。 ...

你这没说在点子上。

我们应该充分利用编译器 检查功能。根据偏移检查。
原理大概就类似memcpy 里面那个aasertt 判断偏移
 楼主| xlsbz 发表于 2014-11-16 20:21 | 显示全部楼层
adce 发表于 2014-11-16 12:17
1.愿闻其区别...
2.
core_cm4.h

sizeof 我说的是这个意思  在一个文件夹下面定义

U8 TMP[10] = 0;那么在这个文件下sizeof[10]就等于10

如果 另一个文件extern U8 TMP[];
那么sizeof[TMP]就等于1.

一般情况下考虑咱们可能考虑通用型 只在一个文件下定义个宏 指出那个10.
所以就要注意
sedatefire 发表于 2014-11-16 20:22 | 显示全部楼层
xlsbz 发表于 2014-11-16 20:18
你这没说在点子上。

我们应该充分利用编译器 检查功能。根据偏移检查。

恩,如果执行
tmp[9] = xx;编译器是会报警的

但是,执行 tmp[index] = xxx, index=无穷大,编译器也不会报警。

sedatefire 发表于 2014-11-16 20:25 | 显示全部楼层
sedatefire 发表于 2014-11-16 20:22
恩,如果执行
tmp[9] = xx;编译器是会报警的

用 tmp[CONSTANT] = xx
这种写法,本身可扩展性差,可移植性也差
一般都是用
struct  TYPE *p = (struct  TYPE *)tmp;
p->var = xxx;
BigEndianToBuf(&p->yyy, xxx);
去搞的
 楼主| xlsbz 发表于 2014-11-16 20:30 | 显示全部楼层
sedatefire 发表于 2014-11-16 20:22
恩,如果执行
tmp[9] = xx;编译器是会报警的

嗯 我说的有点问题 看样子。 以前好像不报警啊。难道是编译器版本新了?

准确说法是

另一个文件 不报警

/* Includes ------------------------------------------------------------------*/
#include "microcb.h"

extern uint8_t   tmp[];

void test(void)
{
  tmp[30] = 0;
}

".\OBJ\firmware.axf" - 0 Error(s), 0 Warning(s).
 楼主| xlsbz 发表于 2014-11-16 20:31 | 显示全部楼层
sedatefire 发表于 2014-11-16 20:25
用 tmp[CONSTANT] = xx
这种写法,本身可扩展性差,可移植性也差
一般都是用

因为 在另一个文件不报警  所以我在一楼的说法仍然是利大于弊
 楼主| xlsbz 发表于 2014-11-16 20:35 | 显示全部楼层
sedatefire 发表于 2014-11-16 20:25
用 tmp[CONSTANT] = xx
这种写法,本身可扩展性差,可移植性也差
一般都是用

你跑题了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

190

主题

1614

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部