1. 在使用VC时为什么编译时没有错误,连接时有错误,不能打开文件
我们通常所说的编译其实包含两个部分:编译和链接。
编译是指把程序源文件编译成目标文件,即vc下的.o文件。
链接是指把目标文件生成可执行文件。
链接的时候,如果某个函数只有声明,但没有实现,或者依赖第三方库,但只提供了头文件,没有提供库文件,或者库文件的版本不对,都会导致链接错误,而这些错误,在编译阶段通常是不会报错的。所以,你可以针对上面提到的几点一一排除一下:
1,程序中所用到的自己写的函数是否都已经实现;
2,如果使用了第三方库,确认是否已经有了第三方库,是否在工程设置中包含了库文件,并且配置了库文件搜索路径,保证编译器能找到所需要的库文件;
3,如果使用了第三方库,确认所使用的库文件版本是对的。
如果上面这些都做好,基本上就不会有问题了。
2. c语言中在两个文件中命名了相同的变量名,在内存中会不会读取错误
如果在不同的c文件中定义了同名的全局变量,则它们会占用相同的内存空间,而且编译链接时不会报错!
这可以参考全局变量的内存初始化顺序,对于局部变量而言,内存分配的顺序和代码的顺序是一样好庆的。全局变量就不一样了;一般的编译器,
(1) 对于初始化的全局变量,碰到之后就知道这是一个定义,会马上分配空间,
(2) 对于没有初始化的全局变量,因为不知道是定义还是声明,所以要在扫描完所有代码之后才能决定,这个时候编译器会读符号表,然后看哪些变量没有分配空间.
(3)不同源文件间全局变量的初始化顺序:对于全局变量而言,除了在同一个文件定义的全局对象的初始化 是按照定义次序来进行的之外,其他全局或友戚握静态变量之间的初仔源始化次序没有任何保障的。
3. vc6写书上的程序,编译不报错,无法执行。错误为执行Link.exe出错
既然题主提出了这个问题,说明题主的编程语言理论严重缺乏。
在C/C++中,我们一般认为有两个阶段(其实有很多): 编译和链接。而题主所提供的图表示的是一种链接错误,而不是编译错误。
编译错误: 存在语法错误,缺少某个头文件等很明显的错误,如果编译错误都不能解决,就说明写代码那个人水平极低。编译主要是针对某个具体模块的。
链接错误:链接是主要针对多个模块而言的。这个理论太多。我就举个例子来说明:地图上的长城与实际的长城,我们平时说去长城玩儿,这个长城指的是“虚”的,可以认为是地图上的长城;但是真正的去长城玩儿的时候,你总不能再地图上玩儿吧,肯定是“实际上的”长城。
下面回归正题:
你这个代码很显然是编译通过的,那么链接没通过说明你的模块之间存在问题。你的代码中调用了AVC,AverageValue这几个函数。但是你能指出这几个函数具体是怎么做的么?具体定义又在哪儿啊?用长城的例子来说明:你只是地图上的长城,但是玩儿的时候必须到实际的长城去玩儿啊。
具体解决办法:
自己写出这几个函数的定义代码,然后将这几个函数符号,放到调用地方的前面。
4. Java什么情况下强转型 编译不报错,运行会报错
向下强制转型——把一个父类(或祖先类)引用强制转换成一个子类(或孙类)引用,是不会发生编译错误的。
但如果这个父类(或祖先类)引用实际引用(指向)的对象,不是一个子类(或孙类)对象,运行时就会抛出异常。
举例来说,如果鸟类和狗类都是动物类的子类。
如果有一个动物类的引用a引用了一个鸟类对象,则此时将a强制转换成狗类引用,就不会报编译错误,但运行时会抛出类型转换异常。
因为a这个装动物的笼子,实际上关的是一只鸟,而需要的动物是一只狗。
5. c语言编程错误,编译不报错 连接就出错了
报错是因为以下两个函数是未定义的。
他们不是C语带知言的库函数,而在提供的代码中又找不到它们的定义,所以连接的时候就会报错。
double power(double x,int n);
double fact(int n);
需要在代码里面蠢森消实现这两个函数,也就是写出这两个函数的功能是如何通过代码来实现的
在原来的代码后面加上以下代码就可以了:
doublepower(doublex,intn)
{doubleans=1;
while(n--)
春扮ans*=x;
rerutnans;
}
doublefact(intn)
{doubleans=1;
if(n>0)
do{
ans*=n;
while(n-->0);
returnans;
}