VC_6中对代码进行预处理时,扫描代码,若代码中没有浮点型的运算,就不进行约定
错误与头文件无关

问题出在 cinit() 中 初始化浮点协处理器的步骤中:_FPinit(初始化浮点处理器),要占用浮点协处理器,从80386开始,处理器就带协处理器8087和主处理器8088,两个处理器一个专门负责整数的处理、一个专门负责浮点小数的处理,此时两个处理器可能冲突,所以需要初始化约定两个处理器如何配合工作(两者配合工作方式的选择:同步、异步,一般协处理器负责浮点的运算,也就是说计算浮点时,主处理器是否要等待浮点运算计算完成使用浮点运算得出的结果),无论整数主处理器是否要等待浮点协处理器,都要进行事先的约定(这就是浮点协处理器初始化的任务之一),对于VC6这种低版本的编译器的做法是,对代码进行预处理前,会先扫描代码,若代码中没有浮点型的运算,就不进行约定(*_FPinit这个函数指针的值置为0,则表示不进行调用,就没有约定,没有初始化),有浮点型运算才会约定。
那么,对于上述代码,由于只是定义了浮点型变量,并没有浮点型的运算(赋值也算浮点型运算,所以上述代码运行后使用scanf对浮点型变量进行赋值时,进行浮点运算就会出现错误),所以不会进行约定,此时就会出现错误
所以想解决上述问题,最简单的只要在代码中对一个浮点型变量先赋一个值,扫描时可以扫描到浮点运算即可(是不是f都可以,随便定义一个也可以),即可解决
新版本的解决过程,就是无论是否进行浮点型变量的运算,都进行约定
本文详细介绍了VC6编译器在处理浮点运算时的一个特性,即如果代码中没有浮点运算,编译器将不会进行浮点协处理器的初始化。这种情况下,直接使用浮点数可能会导致错误。解决方法是在代码中添加一个浮点运算,使得预处理阶段能够检测到浮点操作,从而进行必要的初始化。新版本的编译器则不再依赖这种预处理检查,而是始终进行浮点协处理器的约定。
1194

被折叠的 条评论
为什么被折叠?



