brew 使用浮点数关于libspace.0的错误

在BREW中,能不使用浮点数,尽量不要使用,如果要使用浮点数,可以用定点数来模拟。但是,不幸的是,拿到的代码可能很多都大量使用了浮点数,当将其中的浮点数替换完之后(我是用重定义一个浮点类,然后使用宏替换的),在链接过程中,总出现libspace.o的错误,大致意思是使用了.bss。下面的情况是使用了.bss段,但编译的时候不会出现任何警告,但链接的时候会出现libspace.o错误。
int + float

如果你写出下面的代码:

int temp = 5;
var = temp + 1.0; //var 为float或者double类型


在编译的时候,temp会自动转换成float或者double类型,然后再运算,最后赋值。即使使用宏将var的类型进行了封装,这一步骤也不会消失的(也不会出现警告)。由此,出现了调用libspace.o中的_dflt等函数。同样的,其他的运算符(位运算符除外),也会发生相同的情况。函数调用里的转换也相同。
解决的办法就是写成下面的写法:

int temp = 5;
var = temp + double(1.0); //double会被进行宏替换为模拟的类型

或者:

int temp = 5;
var = FADD(FASSIGN_INT(temp), 1.0); //var 为double或float类型。

相比于第二种写法,在具体的项目中,我一般会替换掉double等类型,定义一个模拟类,然后重载操作符,如果再从BREW到其他支持浮点数的平台上,只用关闭掉模拟类就可以了。其他的几乎不用修改。

发布者

rix

如果连自己都不爱自己,哪还有谁来爱你