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
页: 1 2 3 4 [5]
查看完整版本: 解决编译器【REMOVEUNUSED选项】,可能错误移除问题,现象是感觉复位了