一千分求解,关于UNIX下的GCC和VC6自带的CL处理程序的差别问题

yaoming2002 2004-08-01 01:54:55
以下给出我的问题的简单描述(和项目里相同情况的简单例子)。

在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++不允许的。

应该讲清楚了,请大家帮忙吧,在线等待,一千分决不食言!
...全文
192 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
honeysuckle 2004-08-10
  • 打赏
  • 举报
回复
一切正常阿,在VC的IDE下面用的
//fun1.c
#include "stdio.h"
fun2(float f1, float* f2);
void fun1()
{
float f1 = 2.0;
float f2 = 0;
fun2(f1, &f2);
printf("f1 = %f, f2 = %f", f1, f2);
}
//fun2.c
#include "stdio.h"
void fun2(float f1, float* f2)
{
*f2 = f1 + 4.0;

}
// testCompiler.c
//

#include "stdio.h"
fun1();
//fun2();
int main(int argc, char* argv[])
{
fun1();
return 0;
}
笑面佛_正版 2004-08-10
  • 打赏
  • 举报
回复
多文件的顺序问题, Link fun1时需要调用 Fun2,但此是fun2却没有链接进来,可试着改变 三个.obj文件的顺序
microyzy 2004-08-10
  • 打赏
  • 举报
回复
“另外我比较关心的是为什么在GCC下可以的,在CL下不行,能不能给出解释?或者CL有什么编译开关可以不修改代码就能够做到的?”

C/C++编译器我只用过ms的cl、gcc、intel c++ compiler,我也没有专门研究过,比如printf("%d%s",i);,ms的编译器会正常编译通过,当intel的会报一个错误
我认为,不同编译器的语法处理不同是正常的,这也没什么可解释的,只能是用多了以后,慢慢会发现各种不同编译器之间的差别

kingssman 2004-08-10
  • 打赏
  • 举报
回复
不太懂这方面的东西,顶一下~~~~~~~~~~
yaoming2002 2004-08-04
  • 打赏
  • 举报
回复
啊?这个不是散分贴!!!
gtfcccq 2004-08-03
  • 打赏
  • 举报
回复
帮你顶一下
wmljh 2004-08-03
  • 打赏
  • 举报
回复
好友散分,不懂也顶一下,呵呵
shen13 2004-08-03
  • 打赏
  • 举报
回复
你的fun2.c的程序有问题,你对照下面的代码就知道了,你少了#include<stdio.h>
#include <io.h>

//----------------------------------------------
#include <stdio.h>
extern void fun2(float f1, float* f2);
//----------------------------------------------

void fun1()
{
float f1 = 2.0;
float f2;
fun2(f1, &f2);
printf("f1 = %f, f2 = %f", f1, f2);
}
weiym 2004-08-03
  • 打赏
  • 举报
回复
不懂,顶一下,接分
yaoming2002 2004-08-01
  • 打赏
  • 举报
回复
这里的定义是可以,可为什么修改main.c文件里的main()前的定义还是异常呢?

另外我比较关心的是为什么在GCC下可以的,在CL下不行,能不能给出解释?或者CL有什么编译开关可以不修改代码就能够做到的?
ataotao 2004-08-01
  • 打赏
  • 举报
回复
#include < io.h>

extern void fun2(float f1, float* f2);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

void fun1()
{
float f1 = 2.0;
float f2;
fun2(f1, &f2);
printf("f1 = %f, f2 = %f", f1, f2);
}
yaoming2002 2004-08-01
  • 打赏
  • 举报
回复
已经初始化过了的。问题不在这里。

请高手试一下行么?如果是一般的问题,怎么对得起一千分呢:)
runall 2004-08-01
  • 打赏
  • 举报
回复
初始化变量f2
syy64 2004-08-01
  • 打赏
  • 举报
回复
ding

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧