一千分求解,关于UNIX下的GCC和VC6自带的CL处理程序的差别问题
以下给出我的问题的简单描述(和项目里相同情况的简单例子)。
在GCC下可以实现的float型参数传值和传址,在VC6自带的CL下编译运行后会出现异常:
以下是三个C文件的极简单代码:
//main.c:
fun1();
fun2();
void main()
{
fun1();
}
//fun1.c
#include <io.h>
void fun1()
{
float f1 = 2.0;
float f2;
fun2(f1, &f2);
printf("f1 = %f, f2 = %f", f1, f2);
}
//fun2.c
void fun2(float f1, float* f2)
{
*f2 = f1 + 4.0;
}
以上是三个文件,先用CL分别编译fun1.c,fun2.c生成fun1.obj,fun2.obj
然后用CL编译main.c同时link进fun1.obj和fun2.obj(也可以用VC的IDE把obj文件加到文件列表里)
最后在调试的时候,在fun2里面会出现异常。代码就是最普通的ox0000000c。
如果上述代码里的float全部都换成int型,则能够成功。
而在UNIX下的GCC就可以正常实现上面的工作。
这是什么原因呢?怎么样搞定呢?请有经验的朋友帮忙分析一下吧。
有几点注意的:
1,不能类型转换float->int,这样会损失精度。
2,以上是纯C的操作,不要在C++文件里试,那样空的函数定义C++不允许的。
应该讲清楚了,请大家帮忙吧,在线等待,一千分决不食言!