c或者c++中使用了宏定义来避免重复包含,但是还是提示函数重复定义的解决方法

  通常,我们在编写c/c++代码时,使用宏定以
      #ifndef _xxx_H_
      #define _xxx_H_
  的方式来避免头文件的重复包含。但是,有些情况下还会出现函数重定义的错误,总结原因可以归结为:在头文件中定义了非内联函数。
  对每个包含指定头文件的cpp文件来说,最终都要编译生成一个有这个非内联函数的实体obj文件。如果一个工程中,有多个cpp文件包含了这个头文件,在链接的时候就会产生多个这个非内联函数的实体obj文件,这时,就会报重定义的错误。
  为了避免这样的情况,我们在定义头文件的时候,遵循两个原则:
  • 类型定义,数据类型定义等不需要分配内存的代码放在xxxx.h中,但是像变量定义这类需要分配内存的代码,比如类对象的定义,需要新建一个对应的xxxx.cpp,然后把对象定义放在该cpp文件中。遵循这个原则,那么函数声明,类型定义等等可以放在xxxx.h中,但是函数定义,变量定义则需要放在xxxx.cpp中。
  • 内联函数如果跨文件调用,必须放在头文件中。这是因为内联函数会在任何调用它的地方展开。所以,不会出现链接时重定义的错误。内联展开是在编译时进行的,只有链接的时候源文件之间才有关系。所以内联要想跨源文件必须把实现写在头文件里。如果一个inline函数会在多个源文件中被用到,那么必须把它定义在头文件中。因此,内联函数一般只会用在函数内容非常简单的时候用。
posted @ 2018-08-30 15:37  hudalikm  阅读(2944)  评论(0编辑  收藏  举报