代码

代码

STM32CubeMX生成项目出错,keil打不开

问题困惑平凡的人生不平凡的梦 回复了问题 • 3 人关注 • 5 个回复 • 467 次浏览 • 2020-03-06 17:49 • 来自相关话题

CubeMx生成MDK出错,怎么解决?MX是5.5.0 WIN7

问题困惑yuanyongcheng 回复了问题 • 2 人关注 • 4 个回复 • 200 次浏览 • 2020-02-17 13:47 • 来自相关话题

STM32 cubeIDE如何像keil一样使用__attribute__指定变量的存储位置

回复

问题困惑≮陈 先苼≯ 发起了问题 • 1 人关注 • 0 个回复 • 1143 次浏览 • 2019-11-13 17:29 • 来自相关话题

经常看到do...while(0)的宏,do...while(0)其实有很多作用,你知道吗?

其他分享admin 发表了文章 • 1 个评论 • 1199 次浏览 • 2015-06-16 09:40 • 来自相关话题

1、避免goto语句:
通常,如果一个函数开始要分配一些资源,然后如果在中途遇到错误则要退出函数,当然,退出前要释放资源,我们的代码可能如下: 


#defien N 10

bool Execute()
{
// 分配资源
int [i]p = (int [/i])malloc(N * sizeof(int));
bool bOk = true;

// 执行并进行错误处理
bOk = func1();
if(!bOk)
{
free(p);
p = NULL;
return false;
}

bOk = func2();
if(!bOk)
{
free(p);
p = NULL;
return false;
}

bOk = func3();
if(!bOk)
{
free(p);
p = NULL;
return false;
}

// ..........

// 执行成功,释放资源并返回
free(p);
p = NULL;
return true;
}

C代码

这里最大的问题是代码冗余,每增加一个操作,就要做相应的错误处理,非常不灵活,于是想到了一下的goto:


#defien N 10

bool Execute()
{
// 分配资源
int [i]p = (int [/i])malloc(N * sizeof(int));
bool bOk = true;

// 执行并进行错误处理
bOk = func1();
if(!bOk) goto errorhandle;

bOk = func2();
if(!bOk) goto errorhandle;

bOk = func3();
if(!bOk) goto errorhandle;

// ..........

// 执行成功,释放资源并返回
free(p);
p = NULL;
return true;

errorhandle:
free(p);
p = NULL;
return false;
}

C代码

代码冗余是解决了,但是引入了C语言中比较微妙的goto语句,虽然正确的使用goto语句可以大大提高程序的灵活性与简洁性,但是会使我们的程序捉摸不定,为了既避免使用goto语句,又能消除代码冗余,可以考虑使用下面的 do...while(0):


#defien N 10

bool Execute()
{
//分配资源
int [i]p = (int [/i])malloc(N * sizeof(int));
bool bOK = true;


do {
//执行并进行错误处理
bOK = fun1();
if(!bOK) break;

bOK = fun2();
if(!bOK) break;

bOK = fun3();
if(!bOK) break;

//.........
} while(0);

//释放资源

free(p);
p = NULL;
return bOK;
}

C代码

避免空声明在编译时出现警告:
在linux内核源代码中,经常看到如下宏以避免在编译时出现警告:


#define FOO do { } while(0)

提供一个声明局部变量的基础块:
你可能经常会使用如下的宏:


#define exch(x,y) { int tmp; tmp=x; x=y; y=tmp; }

然而在某些情况下将会失效,下面的代码使用if...else...


if (x > y)
exch(x,y); // 分支 1
else
do_something(); // 分支 2

但是将被解释为一个分支的if语句:


if (x > y) {
int tmp;
tmp = x;
x = y;
y = tmp;
}
; // 空语句
else // ERROR!!!
do_something();

错误出在“;”直接位于代码块的后面,解决的办法是将代码嵌入do...while(0),于是得到下面的代码:


if (x > y)
do {
int tmp;
tmp = x;
x = y;
y = tmp;
} while(0);
else
do_something();

于是上面的宏可以修改为:


#define exch(x,y) do {\
2 int tmp;\
3 tmp = x;\
4 x = y;\
5 y = tmp;\
6 } while(0)

在条件语句中使用复杂的宏:


#define FOO(x) \
printf("arg is %s\n", x); \
do_something_useful(x);

现在想像一下下面的代码:


if (blah == 2)
FOO(blah);

这将解释为:


if (blah == 2)
printf("arg is %s\n", blah);
do_something_useful(blah);;

我们就会发现,if语句只作用于printf(), do_something_useful() 没按照愿意一起执行,即没有像你预期的那样被包含在if代码中,于是可以使用如下的代码块:


if (blah == 2)
do {
printf("arg is %s\n", blah);
do_something_useful(blah);
} while (0);

这样上面的宏就可以改为:


#define FOO(x) do { \
printf("arg is %s\n", blah);\
do_something_useful(blah);\
} while (0)

PS:以上的第三种和第四种技巧,并不是唯一的方法,有同学留言说用其他的方法也可以实现,反而显得这样的宏定义过于花哨?事实并非如此,这样的宏定义在linux内核代码中非常常见,原因是代码简洁、通用、可移植性好

作者:cpoint

出处:http://www.cnblogs.com/cpoint/ 查看全部
1、避免goto语句:
通常,如果一个函数开始要分配一些资源,然后如果在中途遇到错误则要退出函数,当然,退出前要释放资源,我们的代码可能如下: 


#defien N 10

bool Execute()
{
// 分配资源
int [i]p = (int [/i])malloc(N * sizeof(int));
bool bOk = true;

// 执行并进行错误处理
bOk = func1();
if(!bOk)
{
free(p);
p = NULL;
return false;
}

bOk = func2();
if(!bOk)
{
free(p);
p = NULL;
return false;
}

bOk = func3();
if(!bOk)
{
free(p);
p = NULL;
return false;
}

// ..........

// 执行成功,释放资源并返回
free(p);
p = NULL;
return true;
}

C代码

这里最大的问题是代码冗余,每增加一个操作,就要做相应的错误处理,非常不灵活,于是想到了一下的goto:


#defien N 10

bool Execute()
{
// 分配资源
int [i]p = (int [/i])malloc(N * sizeof(int));
bool bOk = true;

// 执行并进行错误处理
bOk = func1();
if(!bOk) goto errorhandle;

bOk = func2();
if(!bOk) goto errorhandle;

bOk = func3();
if(!bOk) goto errorhandle;

// ..........

// 执行成功,释放资源并返回
free(p);
p = NULL;
return true;

errorhandle:
free(p);
p = NULL;
return false;
}

C代码

代码冗余是解决了,但是引入了C语言中比较微妙的goto语句,虽然正确的使用goto语句可以大大提高程序的灵活性与简洁性,但是会使我们的程序捉摸不定,为了既避免使用goto语句,又能消除代码冗余,可以考虑使用下面的 do...while(0):


#defien N 10

bool Execute()
{
//分配资源
int [i]p = (int [/i])malloc(N * sizeof(int));
bool bOK = true;


do {
//执行并进行错误处理
bOK = fun1();
if(!bOK) break;

bOK = fun2();
if(!bOK) break;

bOK = fun3();
if(!bOK) break;

//.........
} while(0);

//释放资源

free(p);
p = NULL;
return bOK;
}

C代码

避免空声明在编译时出现警告:
在linux内核源代码中,经常看到如下宏以避免在编译时出现警告:


#define FOO do { } while(0)

提供一个声明局部变量的基础块:
你可能经常会使用如下的宏:


#define exch(x,y) { int tmp; tmp=x; x=y; y=tmp; }

然而在某些情况下将会失效,下面的代码使用if...else...


if (x > y)
exch(x,y); // 分支 1
else
do_something(); // 分支 2

但是将被解释为一个分支的if语句:


if (x > y) {
int tmp;
tmp = x;
x = y;
y = tmp;
}
; // 空语句
else // ERROR!!!
do_something();

错误出在“;”直接位于代码块的后面,解决的办法是将代码嵌入do...while(0),于是得到下面的代码:


if (x > y)
do {
int tmp;
tmp = x;
x = y;
y = tmp;
} while(0);
else
do_something();

于是上面的宏可以修改为:


#define exch(x,y) do {\
2 int tmp;\
3 tmp = x;\
4 x = y;\
5 y = tmp;\
6 } while(0)

在条件语句中使用复杂的宏:


#define FOO(x) \
printf("arg is %s\n", x); \
do_something_useful(x);

现在想像一下下面的代码:


if (blah == 2)
FOO(blah);

这将解释为:


if (blah == 2)
printf("arg is %s\n", blah);
do_something_useful(blah);;

我们就会发现,if语句只作用于printf(), do_something_useful() 没按照愿意一起执行,即没有像你预期的那样被包含在if代码中,于是可以使用如下的代码块:


if (blah == 2)
do {
printf("arg is %s\n", blah);
do_something_useful(blah);
} while (0);

这样上面的宏就可以改为:


#define FOO(x) do { \
printf("arg is %s\n", blah);\
do_something_useful(blah);\
} while (0)

PS:以上的第三种和第四种技巧,并不是唯一的方法,有同学留言说用其他的方法也可以实现,反而显得这样的宏定义过于花哨?事实并非如此,这样的宏定义在linux内核代码中非常常见,原因是代码简洁、通用、可移植性好

作者:cpoint



出处:http://www.cnblogs.com/cpoint/

STM32CubeMX生成项目出错,keil打不开

回复

问题困惑平凡的人生不平凡的梦 回复了问题 • 3 人关注 • 5 个回复 • 467 次浏览 • 2020-03-06 17:49 • 来自相关话题

CubeMx生成MDK出错,怎么解决?MX是5.5.0 WIN7

回复

问题困惑yuanyongcheng 回复了问题 • 2 人关注 • 4 个回复 • 200 次浏览 • 2020-02-17 13:47 • 来自相关话题

STM32 cubeIDE如何像keil一样使用__attribute__指定变量的存储位置

回复

问题困惑≮陈 先苼≯ 发起了问题 • 1 人关注 • 0 个回复 • 1143 次浏览 • 2019-11-13 17:29 • 来自相关话题

经常看到do...while(0)的宏,do...while(0)其实有很多作用,你知道吗?

其他分享admin 发表了文章 • 1 个评论 • 1199 次浏览 • 2015-06-16 09:40 • 来自相关话题

1、避免goto语句:
通常,如果一个函数开始要分配一些资源,然后如果在中途遇到错误则要退出函数,当然,退出前要释放资源,我们的代码可能如下: 


#defien N 10

bool Execute()
{
// 分配资源
int [i]p = (int [/i])malloc(N * sizeof(int));
bool bOk = true;

// 执行并进行错误处理
bOk = func1();
if(!bOk)
{
free(p);
p = NULL;
return false;
}

bOk = func2();
if(!bOk)
{
free(p);
p = NULL;
return false;
}

bOk = func3();
if(!bOk)
{
free(p);
p = NULL;
return false;
}

// ..........

// 执行成功,释放资源并返回
free(p);
p = NULL;
return true;
}

C代码

这里最大的问题是代码冗余,每增加一个操作,就要做相应的错误处理,非常不灵活,于是想到了一下的goto:


#defien N 10

bool Execute()
{
// 分配资源
int [i]p = (int [/i])malloc(N * sizeof(int));
bool bOk = true;

// 执行并进行错误处理
bOk = func1();
if(!bOk) goto errorhandle;

bOk = func2();
if(!bOk) goto errorhandle;

bOk = func3();
if(!bOk) goto errorhandle;

// ..........

// 执行成功,释放资源并返回
free(p);
p = NULL;
return true;

errorhandle:
free(p);
p = NULL;
return false;
}

C代码

代码冗余是解决了,但是引入了C语言中比较微妙的goto语句,虽然正确的使用goto语句可以大大提高程序的灵活性与简洁性,但是会使我们的程序捉摸不定,为了既避免使用goto语句,又能消除代码冗余,可以考虑使用下面的 do...while(0):


#defien N 10

bool Execute()
{
//分配资源
int [i]p = (int [/i])malloc(N * sizeof(int));
bool bOK = true;


do {
//执行并进行错误处理
bOK = fun1();
if(!bOK) break;

bOK = fun2();
if(!bOK) break;

bOK = fun3();
if(!bOK) break;

//.........
} while(0);

//释放资源

free(p);
p = NULL;
return bOK;
}

C代码

避免空声明在编译时出现警告:
在linux内核源代码中,经常看到如下宏以避免在编译时出现警告:


#define FOO do { } while(0)

提供一个声明局部变量的基础块:
你可能经常会使用如下的宏:


#define exch(x,y) { int tmp; tmp=x; x=y; y=tmp; }

然而在某些情况下将会失效,下面的代码使用if...else...


if (x > y)
exch(x,y); // 分支 1
else
do_something(); // 分支 2

但是将被解释为一个分支的if语句:


if (x > y) {
int tmp;
tmp = x;
x = y;
y = tmp;
}
; // 空语句
else // ERROR!!!
do_something();

错误出在“;”直接位于代码块的后面,解决的办法是将代码嵌入do...while(0),于是得到下面的代码:


if (x > y)
do {
int tmp;
tmp = x;
x = y;
y = tmp;
} while(0);
else
do_something();

于是上面的宏可以修改为:


#define exch(x,y) do {\
2 int tmp;\
3 tmp = x;\
4 x = y;\
5 y = tmp;\
6 } while(0)

在条件语句中使用复杂的宏:


#define FOO(x) \
printf("arg is %s\n", x); \
do_something_useful(x);

现在想像一下下面的代码:


if (blah == 2)
FOO(blah);

这将解释为:


if (blah == 2)
printf("arg is %s\n", blah);
do_something_useful(blah);;

我们就会发现,if语句只作用于printf(), do_something_useful() 没按照愿意一起执行,即没有像你预期的那样被包含在if代码中,于是可以使用如下的代码块:


if (blah == 2)
do {
printf("arg is %s\n", blah);
do_something_useful(blah);
} while (0);

这样上面的宏就可以改为:


#define FOO(x) do { \
printf("arg is %s\n", blah);\
do_something_useful(blah);\
} while (0)

PS:以上的第三种和第四种技巧,并不是唯一的方法,有同学留言说用其他的方法也可以实现,反而显得这样的宏定义过于花哨?事实并非如此,这样的宏定义在linux内核代码中非常常见,原因是代码简洁、通用、可移植性好

作者:cpoint

出处:http://www.cnblogs.com/cpoint/ 查看全部
1、避免goto语句:
通常,如果一个函数开始要分配一些资源,然后如果在中途遇到错误则要退出函数,当然,退出前要释放资源,我们的代码可能如下: 


#defien N 10

bool Execute()
{
// 分配资源
int [i]p = (int [/i])malloc(N * sizeof(int));
bool bOk = true;

// 执行并进行错误处理
bOk = func1();
if(!bOk)
{
free(p);
p = NULL;
return false;
}

bOk = func2();
if(!bOk)
{
free(p);
p = NULL;
return false;
}

bOk = func3();
if(!bOk)
{
free(p);
p = NULL;
return false;
}

// ..........

// 执行成功,释放资源并返回
free(p);
p = NULL;
return true;
}

C代码

这里最大的问题是代码冗余,每增加一个操作,就要做相应的错误处理,非常不灵活,于是想到了一下的goto:


#defien N 10

bool Execute()
{
// 分配资源
int [i]p = (int [/i])malloc(N * sizeof(int));
bool bOk = true;

// 执行并进行错误处理
bOk = func1();
if(!bOk) goto errorhandle;

bOk = func2();
if(!bOk) goto errorhandle;

bOk = func3();
if(!bOk) goto errorhandle;

// ..........

// 执行成功,释放资源并返回
free(p);
p = NULL;
return true;

errorhandle:
free(p);
p = NULL;
return false;
}

C代码

代码冗余是解决了,但是引入了C语言中比较微妙的goto语句,虽然正确的使用goto语句可以大大提高程序的灵活性与简洁性,但是会使我们的程序捉摸不定,为了既避免使用goto语句,又能消除代码冗余,可以考虑使用下面的 do...while(0):


#defien N 10

bool Execute()
{
//分配资源
int [i]p = (int [/i])malloc(N * sizeof(int));
bool bOK = true;


do {
//执行并进行错误处理
bOK = fun1();
if(!bOK) break;

bOK = fun2();
if(!bOK) break;

bOK = fun3();
if(!bOK) break;

//.........
} while(0);

//释放资源

free(p);
p = NULL;
return bOK;
}

C代码

避免空声明在编译时出现警告:
在linux内核源代码中,经常看到如下宏以避免在编译时出现警告:


#define FOO do { } while(0)

提供一个声明局部变量的基础块:
你可能经常会使用如下的宏:


#define exch(x,y) { int tmp; tmp=x; x=y; y=tmp; }

然而在某些情况下将会失效,下面的代码使用if...else...


if (x > y)
exch(x,y); // 分支 1
else
do_something(); // 分支 2

但是将被解释为一个分支的if语句:


if (x > y) {
int tmp;
tmp = x;
x = y;
y = tmp;
}
; // 空语句
else // ERROR!!!
do_something();

错误出在“;”直接位于代码块的后面,解决的办法是将代码嵌入do...while(0),于是得到下面的代码:


if (x > y)
do {
int tmp;
tmp = x;
x = y;
y = tmp;
} while(0);
else
do_something();

于是上面的宏可以修改为:


#define exch(x,y) do {\
2 int tmp;\
3 tmp = x;\
4 x = y;\
5 y = tmp;\
6 } while(0)

在条件语句中使用复杂的宏:


#define FOO(x) \
printf("arg is %s\n", x); \
do_something_useful(x);

现在想像一下下面的代码:


if (blah == 2)
FOO(blah);

这将解释为:


if (blah == 2)
printf("arg is %s\n", blah);
do_something_useful(blah);;

我们就会发现,if语句只作用于printf(), do_something_useful() 没按照愿意一起执行,即没有像你预期的那样被包含在if代码中,于是可以使用如下的代码块:


if (blah == 2)
do {
printf("arg is %s\n", blah);
do_something_useful(blah);
} while (0);

这样上面的宏就可以改为:


#define FOO(x) do { \
printf("arg is %s\n", blah);\
do_something_useful(blah);\
} while (0)

PS:以上的第三种和第四种技巧,并不是唯一的方法,有同学留言说用其他的方法也可以实现,反而显得这样的宏定义过于花哨?事实并非如此,这样的宏定义在linux内核代码中非常常见,原因是代码简洁、通用、可移植性好

作者:cpoint



出处:http://www.cnblogs.com/cpoint/