硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1322|回复: 14
收起左侧

[开发工具] MDK AC6 函数内 定义相同的变量 居然不报错!

[复制链接]

6

主题

68

回帖

86

积分

初级会员

积分
86
发表于 2024-8-23 15:35:18 | 显示全部楼层 |阅读模式
如图:

下载.png

仿真发现有3个一样的结构体变量,但是这样的函数肯定有问题的。。。
回复

使用道具 举报

4

主题

126

回帖

138

积分

初级会员

积分
138
发表于 2024-8-23 15:44:58 | 显示全部楼层
C语言的基础,变量的生命周期。这是符合语法的,不符合安全编码规范。
回复

使用道具 举报

6

主题

68

回帖

86

积分

初级会员

积分
86
 楼主| 发表于 2024-8-23 15:49:53 | 显示全部楼层
测试发现: 如果进第一个if语句,can报文发送异常;如果进第二个if语句,can报文发送又正常。如何解释?
回复

使用道具 举报

6

主题

18

回帖

36

积分

新手上路

积分
36
发表于 2024-8-23 15:50:55 | 显示全部楼层
C语言允许这样定义,但是不推荐。一对大括号称为作用域,在其中定义的变量只在该作用域内有效,且会覆盖作用域外的同名变量。
回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-8-23 15:56:52 | 显示全部楼层
当然不会报错,大部分编程语言都是这样的,符合语法,不在同一对花括号内重复定义就不会报错
回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-8-23 15:59:35 | 显示全部楼层
程序肯定是有问题,如果两个if都没进,就是野指针,这种代码过不了静态代码检查的
回复

使用道具 举报

43

主题

1054

回帖

1188

积分

至尊会员

积分
1188
发表于 2024-8-23 16:00:31 | 显示全部楼层
符合语法规范,但实际肯定要出问题。
回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-8-23 16:02:11 | 显示全部楼层
casy99 发表于 2024-8-23 15:49
测试发现: 如果进第一个if语句,can报文发送异常;如果进第二个if语句,can报文发送又正常。如何解释?

看不到完整代码,我猜可能和优化有关系
回复

使用道具 举报

6

主题

68

回帖

86

积分

初级会员

积分
86
 楼主| 发表于 2024-8-23 16:10:39 | 显示全部楼层
哈哈,没想到引来了这么多的关注!
总结一下:
这这是一个简单测试函数demo,如果逻辑复杂后,别人来看代码压根就不知道这3个相同的变量哪个是哪个了。肯定蒙圈了,只能说AC6 语法太灵活了,灵活到容易犯错,哈哈

最后,还是不推荐这样子写,不安全!
回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-8-23 16:11:21 | 显示全部楼层
我估计这个代码应该是靠bug跑起来的,正常情况下,不管进哪个if语句,这个指针一直都是野指针,没指向预期的位置,换个编译器或者换个优化等级肯定会出问题,可以找个在线编译器跑一下我这个代码
[C] 纯文本查看 复制代码
int main()
{
	int a;
	{int a=3;}
	{int a=4;}
   printf("%d",&a);
   return 0;
}
回复

使用道具 举报

43

主题

1054

回帖

1188

积分

至尊会员

积分
1188
发表于 2024-8-23 16:40:29 | 显示全部楼层
跟AC6有什么关系?这是C语言标准的作用范围问题。里面两个的作用范围仅限于他们自己的括号范围,括号范围外的是不能引用里面的。代码执行到括号后他们是失效了,他们占用的空间就被用来做其他的了,不出问题才怪。
你把最上面的定义删掉,肯定就报错了。
回复

使用道具 举报

3

主题

432

回帖

441

积分

高级会员

积分
441
发表于 2024-8-23 19:44:57 | 显示全部楼层
大家对基础语法的话题,还是挺有热情的。
回复

使用道具 举报

2

主题

89

回帖

95

积分

初级会员

积分
95
发表于 2024-8-23 20:08:47 | 显示全部楼层
C 语言基础,补一补。
回复

使用道具 举报

6

主题

68

回帖

86

积分

初级会员

积分
86
 楼主| 发表于 2024-8-24 08:07:38 | 显示全部楼层
CoderXMan 发表于 2024-8-23 20:08
C 语言基础,补一补。

这可不是C语言基础了,这是扩展的GUN语法
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2024-8-30 17:21:53 | 显示全部楼层
[C] 纯文本查看 复制代码
int *p;
{
    int a = 3;
    p = &a;
}
// 此时,a 已经超出作用域,但指针 p 仍然指向它
printf("%d", *p); // 未定义行为,p 是野指针
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-15 20:49 , Processed in 0.056548 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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