您的位置:首页 > 其它

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

2015-05-10 15:23 218 查看
问题描述:

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

<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中去,一来对于函数的实现可以得到较好的隐藏,而来也方便该模块的扩展,有时候我比较喜欢偷懒总觉得少一个类少一个文件更好,其实不然吧,项目尽量的模块化,对象化,不要怕麻烦而少写一些东西。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐