关于函数实现在头文件(.h)中造成的一个问题

问题描述:

在项目中遇到一个问题,把一个比较简短但是经常(包括其他文件中的使用)使用的函数放在头文件中实现,造成了一个链接错误。

<span style="font-family: Arial, Helvetica, sans-serif;">// file1. h     预处理宏  #ifndef __FILE1_H__  等省了没写,下同。</span>
void function( )
{
  ;
}

// file2.h
#include "file1.h"
void f ( );

// file2.cpp
void f( )
{
  function();
}

// file3.cpp
#include "file1.h"
#include "file2.h"

function( );
f( );

编译通过,链接出错。分析原因,在编译c++文件时候,编译器把每一个cpp文件作为一个独立的编译单元,在每次编译一个文件的时候编译器都重新运行是一个独立的进程,比如在linux系统中经常适用的命令 gcc  file3.cpp ,得到 一个obj文件,最后经过链接得到可执行文件。在编译之前,所包含的头文件被包含到cpp中,所以在编译file2.cpp得到的file2.obj中存在一个关于function函数的符号;同样的在编译file3.cpp的时候包含了file1.h,在编译file3.cpp得到的file3.obj中也有一个function函数的符号,在链接的时候出现相同的符号将导致重复定义而链接错误。

解决办法:

1,把file1.h 中的函数 function 的实现放到file1.cpp中去,这样在编译时候function函数的符号只在file1.cpp中出现一次,链接可以通过。

2,在file3.cpp中对于function函数使用外部引用:

extern void function( ); // 这样在编译file3.cpp时,编译器把function函数当作外部引用方法,不会为它建立对应的符号,链接时也可以通过。
3,建议函数的实现都放到cpp中去,一来对于函数的实现可以得到较好的隐藏,而来也方便该模块的扩展,有时候我比较喜欢偷懒总觉得少一个类少一个文件更好,其实不然吧,项目尽量的模块化,对象化,不要怕麻烦而少写一些东西。






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值