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