我刚才装了一下C-FREE,通不过
#include<stdio.h>
void DimFunction()
{
void PrintWord();
}
void OutFunction()
{
PrintWord();
}
void main()
{
OutFunction();
}
void PrintWord()
{
printf("Money!");
}
----------------解决方案--------------------------------------------------------
我用C-FREE也是如此
也就是说微软C如你所说
宝蓝C如我所说
我说过了
----------------解决方案--------------------------------------------------------
C-FREE好像用的是微软C的内核吧
----------------解决方案--------------------------------------------------------
看附件
----------------解决方案--------------------------------------------------------
我看错了
----------------解决方案--------------------------------------------------------
规范的编译器都和我的结果一样,不规范的都和你的结果一样
----------------解决方案--------------------------------------------------------
纯属偏激想法
----------------解决方案--------------------------------------------------------
#include<stdio.h>
void DimFunction()
{
void PrintWord();
}
void OutFunction()
{
PrintWord();
}
void main()
{
OutFunction();
}
void PrintWord()
{
printf("Money!");
}
能通过。
但去掉void DimFunction()
{
void PrintWord();
}后不能通过。
是因为当编译器遇到第一条PrintWord()语句时,误认为是函数声明语句。
故发生重定义类型不匹配的错误。(一个返回值为默认整型 ,一个返回值为空。)
如改用如下函数。(我只改变了返回值类型)。
#include<stdio.h>
int OutFunction()
{
return PrintWord();
}
void main()
{
printf("%d", OutFunction());
}
int PrintWord()
{
return 5;
}
此时编译是能成功的。
----------------解决方案--------------------------------------------------------
我在18楼的回复是针对lz在3楼的回复的,lz问的是几个程序在运行上有什么区别,所以我说的是编译器生成的可执行程序运行时的差别,在汇编层调试就可找到答案,而不是其他回复中谈到的语言层面的东西。说实话这问题在语言层面很简单,c水平不是太菜的都知道。下午没时间搞,忙了一下午晚上才回来,头有点晕,只是用TC编译了lz的头两个程序,生成了z1.obj,z1.exe和z2.obj,z2.exe(我想TC生成的16位程序可能比vc生成的32位简单些,所以用tc)。
用Windows下的DEBUG打开z1.exe和z2.exe发现两个文件是一样的,打开z1.obj和z2.obj发现两个文件某些地方有些差别,和我在18楼的猜想是一样的,即编译后有差别,连接后就是一样的。
这个问题在c中没有什么意义,因为一般人学c只是关心c标准是什么样的(语言层面),这是所有编译器都共同遵守的(大多数情况下),但是编译器如何去实现标准,如何生成可执行程序,这是因编译器而异,不同编译器实现是不一样的,就是相同源代码不同编译器生成的可执行程序也可能不一样,只有部分爱好者才关心程序运行时在内存中的模型。
----------------解决方案--------------------------------------------------------