在头文件中用宏定义来避免重复包含,仍然会出现函数重定义的错误

本博客转载于:http://blog.csdn.net/kkforwork/article/details/42679041


1. 在头文件包含中用了宏定义,还是会出现函数重定义的错误,表现为“error LNK2005: 已经在*.obj中定义“。

主要原因是在头文件中定义了函数。

因为对每个包含这个头文件的cpp文件而言,都要编译生成一个有这个函数实体的obj文件,对于单个文件而言没有重复定义。但对于整个工程而言,在链接的时候会因为有多个函数定义实体,而报错。

2.  为避免重复定义, 结构体的定义和静态数据的定义也不能放在头文件里?

把定义看成两种:类型定义,数据定义
类型定义不分配内存的,比如类的定义,结构体的定义,它是定义一个数据类型而已
数据定义分配内存,比如类对象定义,变量定义
一个原则:
不分配内存的,放在头文件
分配内存的放在cpp文件,放置重复定义
综上所述,你就可以知道结构体的定义属于类型定义放在头文件,静态数据的定义属于数据定义放在cpp文件
对于函数相同,函数声明你可以看作类型定义,函数实现看作数据定义

3. 另外,对于这一种错误,可以将定义在头文件里的函数定义成inline类型。

因为内联函数的代码会在任何调用它的地方展开。因此,不会出现链接时重定义的错误。

内联展开是在编译时进行的,只有链接的时候源文件之间才有关系。所以内联要想跨源文件必须把实现写在头文件里。如果一个inline函数会在多个源文件中被用到,那么必须把它定义在头文件中。

因此,内联函数一般只会用在函数内容非常简单的时候用。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值