C++ : 编程重定义错误

C++ 编程重定义错误:

错误1:所编译的函数实现,已经在目标程序.obj文件中出现。

错误原因:包含的头文件中出现了实现部分的代码,或者在头文件尾部包含了对应的.cpp文件。

解决方法:将程序的声明和定义(实现)严格区分开,将声明存放操.h、.hpp文件中,将实现存放到.cpp文件中。因为.cpp文件是单独分开编译,如果头文件被多处引用可能导致实现部分被重复包含到不同的.cpp文件中,从而导致多重编译。

错误2:某变量多重定义:

错误原因:多处被包含的头文件中存在变量的定义和声明。此处需要注意,带有内存分配的变量声明也可以被理解成定义。

解决方案:

         方案一:在其他.cpp文件需要声明变量来源,采用extern关键字声明,此关键字只是对变量的外部声明,并不是重新定义变量,因此没有内存分配,可以理解程序中仅存在一份变量,多处可以调用此变量,因此可以实现内存共享。

         方案二:在头文件变量名前加上static关键字,定义变量为内部链接,这样每一个包含此头文件的源文件都含有内部链接变量的副本,且相互之间不会影响。这样就将此变量变成了源文件内部的局部变量。

其他注意事项:

         模板类的类函数声明和实现需要放在同一个头文件中或者同一个源文件中,但通常放在同一个头文件中。

         函数默认参数列表从右到左匹配,如果在函数声明时已经初始化了默认参数列表,在函数定义时则不需要再次填写默认参数值;或者在定义的时候添加默认参数值,则在声明时不需要添加默认参数值,推荐在声明中添加默认值。

         Inline关键字是非强制性的,编译器会根据需要在程序预编译过程中将函数体代码添加到引用此函数处。使用原则,程序代码段较小,程序运行的时间可能比函数调用的时间还短。

         控制程序编译结构:使用预编译宏命令,#define 、#if defined 、#ifdef、 #ifdefined()、 #ifndef 、#else 等。建议在文件开通判断宏定义,为每段需要控制的代码取宏名,后面需要做修改则只需修改最开始的宏定义,方便编译控制。


猜你喜欢

转载自blog.csdn.net/jekcai/article/details/80018833