程序中的错误

编译错误

 

没有找到某个函数的实现

 

一般情况

可能需要的函数需要的是一个const类型的参数,或者该函数就是const型。修改你的函数声明和定义。(特别在使用标准C++类时,提供自己的实现函数的时候)

举例来说复制构造函数的参数必须是const型,而operator==, operator<这些函数除了参数外,函数本身也要是const型。

 

如果主程序是c++,而函数实现文件是c源程序,那么就会在link的时候找不到函数的实现,需要把c源程序文件改成cpp后缀。

inline

首先要理解inline的含义,如果一个头文件里有函数的实现的话,并且这个函数为inline,当这个头文件被包含进入多个源文件时,link时不会有重复定义的错误。inline(内联)前缀保证了函数只有在一个obj中可见,如同static一样。

如果在源程序中使用了inline标志的话,这个函数只能在这个源程序对应的.obj文件可见。但实际情况不完全如此,编译器之间是有所区别的。

 

template使用inline:

 

几乎所有的template函数/类都需要放置在一个可以被包含到的头文件之中,之所以没有放在这个函数/类的实现(.cpp)文件中是因为在他们有用之前需要变换成真正的函数/类(在编译期间完成)。一个单纯的template不会在obj文件中占用任何位置(你将无法引用它们的地址),所以没有办法使用它们。

放在头文件中的时候,如果有一个源文件包含了这个头文件,并且使用了这个template函数/类,那么这个template被转变成真正的函数/类(地址可以被引用到的),在obj中占用位置的。这样就会引起一个问题,在不同的obj中可能就存在相同template实现,会造成重复定义的编译错误,这个时候就需要用’inline’这个标志来解决这个问题。

undefined

由于没有定义产生的错误

__cplusplus

这个时候源文件的扩展名一定是.c而不是.cpp。一般C++编译器对.c文件使用C方式编译,对.cpp文件使用C++方式编译(编译器会自动定义__cplusplus)。简单的办法是改文件扩展名为.cpp,也可以直接定义一个__cplusplus

undefined reference

部分同‘没有找到某个函数的实现’。这个一般是链接时产生的错误。

 

如果有太多的undefined reference,而恰好在linux下,检查Makefile文件或Makefile.am文件,可能没有包含某个源程序文件。

virtual function of a class

如果类中有一个virtual function没有实现的话,只要有产生对象实例的地方,在编译时就会有这个错误,不管有没有使用到这个函数。如果这个function只是普通函数,没有实现在编译并没有任何错误(前提是没有使用它)。

这种情况可能跟VTABLE有关,它为每一个virtual function地址保留了一个位置,这个位置上初始化了函数的地址。所以当产生对象实例的时候,不管函数有没有被使用,都需要一个明确的函数地址,没有实现它的话就会报“undefined reference”。

有时候的确没有必要实现一个virtual function,这个时候将函数声明为纯虚函数就可以了,VTABLE的对应栏位将不被初始化。

即使是在派生类中,如果一个父类的某个非纯虚函数没有实现,在产生派生类实例的时候也会出现这个编译错误。

integer constant out of range

一个数字常量存放在程序中需要占用一定的空间。g++-2.9.5默认为一个整形,32位。所以尽管有int64_t这样的64位的数据类型,我们在程序里也不能这样写:

int64_t I = 0x100000000;

这样会报’integer constant out of range’错误,就算这样也不行:

int64_t I = (int64_t)0x100000000;

只能变通一下:

int64_t I = (int64_t)0x10000000 * 0x10;

找不到某个文件

linuxgcc #include “文件” 会在-I指定的路径中查找(不是用’<’和’>’符号吗?)。

用’<’和’>’括起来的文件在系统目录下查找。

make

Makefile中标记的是文件依赖关系,依赖关系式的右边必须存在或者可以生成。当make提示错误时无法 make 一个源文件的时候,通常是由于无法找到这个源文件。如果是用autoconfautomake工具产生Makefile时,而Makefile.am的源文件路径又是正确的话,还发生这样的错误的可能情况就是:这个源文件刚刚从一个目录移动到另一个目录,.Po文件中的记录不会更新。解决的方法就是删掉这个Po文件(将Makefile同目录下的.deps目录中的所有Po文件删除好了),重新执行./configure

运行错误

 

进入函数框架中立刻发生的错误

 

Stack Overflow

局部定义的非静态变量的空间在堆栈上分配,可能变量所占用的空间过多,例如直接定义了一个比较大的对象。

Pointer of Stream

对于输入流来说,get指针指向最后一个字符之后仍是有效的,eof不会被置位。

在批处理时出现的错误

 

对某个函数进行的批处理测试

这个时候大部分的问题都是由于没有初始化或结束时没有回归到初始值引起的。避免的方法就是在程序开始编写之初就考虑连续处理的能力,除非它真的不需要连续被调用。

外部的批处理程序的调用

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值