找回密码
 立即注册
楼主: 王昱顺

解决编译器【REMOVEUNUSED选项】,可能错误移除问题,现象是感觉复位了

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-3-18 17:21:42 | 显示全部楼层
21cns*** 发表于 2025-3-18 16:51
这里的参数加上看看呢
#define main(x) main(x){_m();while(1);sprintf(0, "0");}; void _m(x)

你对这段代码理解有误~这个宏定义里面不需要x,这个x传不传都是void
宏只是替换功能,这个宏替换过去是这样的:
原文:
截图202503181720185735.jpg
替换后:
截图202503181721098493.jpg
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:452
  • 最近打卡:2025-05-01 06:20:50
已绑定手机

13

主题

1257

回帖

2971

积分

金牌会员

积分
2971
发表于 2025-3-18 19:32:52 | 显示全部楼层
erci*** 发表于 2025-3-18 17:21
你对这段代码理解有误~这个宏定义里面不需要x,这个x传不传都是void
宏只是替换功能,这个宏替换过去是这 ...

偶偶,终于明白了这个宏的作用了,受教了!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2025-3-19 08:44:52 | 显示全部楼层
解决【REMOVEUNUSED选项】,可能错误移除的问题,现象是感觉复位了
截图202503190844082022.jpg
截图202503190844202621.jpg
深圳国芯人工智能有限公司-库函数
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:452
  • 最近打卡:2025-05-01 06:20:50
已绑定手机

13

主题

1257

回帖

2971

积分

金牌会员

积分
2971
发表于 2025-3-19 19:56:29 | 显示全部楼层
为什么要用while(P0|!P0),不能写成while(0)吗?

点评

是不想让代码实际执行到最后的sprintf而已,只需要这个语句存在。 具体机制我也不是很清楚,只能说从结果上来看这样是可以修复编译器bug的  详情 回复 发表于 2025-3-19 19:58
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

积分
5452
发表于 2025-3-19 19:58:51 | 显示全部楼层
21cns*** 发表于 2025-3-19 19:56
为什么要用while(P0|!P0),不能写成while(0)吗?

是不想让代码实际执行到最后的sprintf而已,只需要这个语句存在。
具体机制我也不是很清楚,只能说从结果上来看这样是可以修复编译器bug的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:452
  • 最近打卡:2025-05-01 06:20:50
已绑定手机

13

主题

1257

回帖

2971

积分

金牌会员

积分
2971
发表于 2025-3-19 20:19:03 | 显示全部楼层
王*** 发表于 2025-3-19 19:58
是不想让代码实际执行到最后的sprintf而已,只需要这个语句存在。
具体机制我也不是很清楚,只能说从结果 ...

我测试while(0)也可以,并且比while(P0|!P0)编译结果小20字节。

点评

while(0)的话有可能执行到sprintf了 实际是并不想让代码执行过去的,至于多了点字节,不是很多的情况下问题不大  详情 回复 发表于 2025-3-19 20:49
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

积分
5452
发表于 2025-3-19 20:49:11 | 显示全部楼层
21cns*** 发表于 2025-3-19 20:19
我测试while(0)也可以,并且比while(P0|!P0)编译结果小20字节。

while(0)的话有可能执行到sprintf了
实际是并不想让代码执行过去的,至于多了点字节,不是很多的情况下问题不大
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:452
  • 最近打卡:2025-05-01 06:20:50
已绑定手机

13

主题

1257

回帖

2971

积分

金牌会员

积分
2971
发表于 2025-3-19 23:31:09 | 显示全部楼层
王*** 发表于 2025-3-19 20:49
while(0)的话有可能执行到sprintf了
实际是并不想让代码执行过去的,至于多了点字节,不是很多的情况下问 ...

调用_m()即原来的main,原来的main中有while(1),所以while(P0|!P0)永远不会被执行的吧

main(x)
{
  _m();
  while(P0|!P0);
  sprintf(0, "0");
};
void _m(x)
{
  while(1)
  {
    ... ...
  }
}

点评

是的,所以其实就是一种多此一举的代码,但是能让编译器正常链接而不出现bug  详情 回复 发表于 2025-3-20 01:05
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

积分
5452
发表于 2025-3-20 01:05:04 | 显示全部楼层
21cns*** 发表于 2025-3-19 23:31
调用_m()即原来的main,原来的main中有while(1),所以while(P0|!P0)永远不会被执行的吧

main(x)

是的,所以其实就是一种多此一举的代码,但是能让编译器正常链接而不出现bug
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 04:34 , Processed in 0.132562 second(s), 111 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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