关于函数实现在头文件(.h)中造成的一个问题
2015-05-10 15:23
218 查看
问题描述:
在项目中遇到一个问题,把一个比较简短但是经常(包括其他文件中的使用)使用的函数放在头文件中实现,造成了一个链接错误。
编译通过,链接出错。分析原因,在编译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函数使用外部引用:
在项目中遇到一个问题,把一个比较简短但是经常(包括其他文件中的使用)使用的函数放在头文件中实现,造成了一个链接错误。
<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中去,一来对于函数的实现可以得到较好的隐藏,而来也方便该模块的扩展,有时候我比较喜欢偷懒总觉得少一个类少一个文件更好,其实不然吧,项目尽量的模块化,对象化,不要怕麻烦而少写一些东西。
相关文章推荐
- 以上的文章是我解决这样一个问题时候的大致的思路: 把Matlab读取二进制文件的函数变成VBA读取二进制文件,实现同样的功能
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
- 【微信支付】分享一个失败的案例 跨域405(Method Not Allowed)问题 关于IM的一些思考与实践 基于WebSocketSharp 的IM 简单实现 【css3】旋转倒计时 【Html5】-- 塔台管制 H5情景意识 --飞机 谈谈转行
- PHP实现的一个保存远程文件到本地的函数分享
- 关于static修饰一个类中的成员函数的问题
- 关于丢失.bansh_profile配置文件造成-bansh-4.2#问题 推荐
- fopen()函数以"a+"方式打开一个不存在的文件后读写出现问题
- 关于JSP不能通过浏览器直接访问,要通过servlet跳转,但一个jsp文件里面用<iframe>标签包含了另一个jsp的访问问题
- 关于finfo_file函数获取文件mime值验证出错的问题
- C/C++语言之通过定义指针函数方式来实现在一个cpp文件里面获取另外一个cpp文件函数的返回值
- 在tp3.2.3中使用 FormData 对象实现表单的文件上传功能遇到的一个问题及解决方法
- Spring关于使用注解@Configuration去配置FormattingConversionServiceFactoryBean来实现自定义格式字符串处理无效的问题(未找到是什么原因造成的)
- 关于 页面多语言支持的纯前端(JQuery插件)实现及 .json 文件读取报404的问题
- 关于使用jsp实现文本和file文件同时长传的问题
- 关于将函数写入头文件问题(分离式编译)
- matlab中一个由于文件检索无法和函数并行而引发的问题
- 一个坑爹的问题:jsp中在js函数中嵌套java代码造成的问题
- Qt creator工程项目移植时因环境变换造成qmake错误的解决方案 1.问题描述:移植从他机上的qt工程项目,打开时提示: Qt Creator找到了一个由其他开发环境创建的设置文件,或许
- 用pandas里的groupby函数实现把一个大文件按某一列的类型分成多个文件
- 关于C语言feof()函数判断文件结尾的问题分析