ercircle
发表于 2025-3-18 17:21:42
21cnsound 发表于 2025-3-18 16:51
这里的参数加上看看呢
#define main(x) main(x){_m();while(1);sprintf(0, "0");}; void _m(x)
你对这段代码理解有误~这个宏定义里面不需要x,这个x传不传都是void
宏只是替换功能,这个宏替换过去是这样的:
原文:
替换后:
21cnsound
发表于 2025-3-18 19:32:52
ercircle 发表于 2025-3-18 17:21
你对这段代码理解有误~这个宏定义里面不需要x,这个x传不传都是void
宏只是替换功能,这个宏替换过去是这 ...
偶偶,终于明白了这个宏的作用了,受教了!{:4_196:}
神农鼎
发表于 2025-3-19 08:44:52
解决【REMOVEUNUSED选项】,可能错误移除的问题,现象是感觉复位了
深圳国芯人工智能有限公司-库函数
21cnsound
发表于 2025-3-19 19:56:29
为什么要用while(P0|!P0),不能写成while(0)吗?
王昱顺
发表于 2025-3-19 19:58:51
21cnsound 发表于 2025-3-19 19:56
为什么要用while(P0|!P0),不能写成while(0)吗?
是不想让代码实际执行到最后的sprintf而已,只需要这个语句存在。
具体机制我也不是很清楚,只能说从结果上来看这样是可以修复编译器bug的
21cnsound
发表于 2025-3-19 20:19:03
王昱顺 发表于 2025-3-19 19:58
是不想让代码实际执行到最后的sprintf而已,只需要这个语句存在。
具体机制我也不是很清楚,只能说从结果 ...
我测试while(0)也可以,并且比while(P0|!P0)编译结果小20字节。
王昱顺
发表于 2025-3-19 20:49:11
21cnsound 发表于 2025-3-19 20:19
我测试while(0)也可以,并且比while(P0|!P0)编译结果小20字节。
while(0)的话有可能执行到sprintf了
实际是并不想让代码执行过去的,至于多了点字节,不是很多的情况下问题不大
21cnsound
发表于 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)
{
... ...
}
}
王昱顺
发表于 2025-3-20 01:05:04
21cnsound 发表于 2025-3-19 23:31
调用_m()即原来的main,原来的main中有while(1),所以while(P0|!P0)永远不会被执行的吧
main(x)
是的,所以其实就是一种多此一举的代码,但是能让编译器正常链接而不出现bug