woaidongmao

文章均收录自他人博客,但不喜标题前加-[转贴],因其丑陋,见谅!~
随笔 - 1469, 文章 - 0, 评论 - 661, 引用 - 0
数据加载中……

头文件定义的函数,加Inline,否则容易出现link 2005错误

.h中文件定义的函数默认为inline,但有时候却不是如此,所以加上inline,可避免出现link 2005 错误。因为多个cpp包含这个.h的话,函数定义会出现在多个.obj中。、

 

 

 

我写了一个函数放到了一个abc.h文件中,在mfc项目的stdafx.h中添加了包含abc.h   ,则   出现链接错误LNK2005
如不放到stdafx.h中,而直接在使用这个函数的cpp文件里包含这个abc.h   就不会有错 20 回复次数:8

第1个回答
你这个abc.h有函数实现么?
有没有定义全局变量?


第2个回答
谢谢帮助,abc.h
中有函数实现,但没有全局变量


第3个回答
#ifndef   _ABCFUNC
#define   _ABCFUNC
在此处添加函数定义
#endif


第4个回答
使用inline.


第5个回答
#ifndef       _ABCFUNC
#define       _ABCFUNC
在此处添加函数定义
#endif
已经加上了   用的是   #pragma   once  
加入   使用inline.   确实解决了问题   还请   xyzhaopeng     讲讲为什么  


第6个回答
编译器认为你对函数没有作声明,所以会   出错,加上inline就说明你的函数是个内联函数,这样编译器就会认为你是在声明时加的函数体。


第7个回答
编译器是编译每个cpp文件,你在abc.h里面写了函数的实现,afx.h里面include了abc.h,
而有很多gecpp文件include了afx.h,也就是很多个cpp文件里面有这个函数的实现,
在链接器链接时就会发现有多个同名函数,所以会报错.
如果最终只有一个cpp文件include了abc.h则不会出错,或者在abc.h中将函数申明为inline.


第8个回答
谢谢各位的热心帮助  
我是在学习wtl
wtl没有cpp文件,所有实现都写在了h文件里面
却没有这种问题呢?

 

 

#####################################################################################################

#####################################################################################################


VC的LNK2005错误,用于避免重复包含的宏为什么无效?

头文件设置如下:
#ifndef _MY_HPP_
#define _MY_HPP_
/*
内容:
函数A
函数B
……
*/
#endif
可当我在同一工程的多个cpp文件(例如文件1和文件2)里#include此头文件时,编译倒能正常通过,可是连接时却出现了报错。大致意思是说:“在文件1.obj中的函数A已经在文件2中定义。”而且是头文件中有多少个函数就会出现多少条这样的连接错误提示。
既然已经设置了保护宏,为什么还不管用呢?急问,拜托了,叩谢。

作者: 125.33.0.*

2008-5-6 20:08 回复此发言


2
回复:VC的LNK2005错误,用于避免重复包含的宏为什么无效?

如果把被提示的函数设置为inline就不会报错了,可我总不能把所有函数都声明成inline吧?该怎么办啊?

作者: 125.33.0.*

2008-5-6 20:54 回复此发言


3
回复:VC的LNK2005错误,用于避免重复包含的宏为什么无效?

"如果把被提示的函数设置为inline就不会报错了"
说明你在头文件里面有实现。。
这样多个包含这个头文件的cpp文件都有实现
link的时候就有多分。
头文件一般是申明, 实现应该放到某一个cpp文件里面
这样link的时候就只有一份在“某一个cpp文件”

作者: 125.34.177.*

2008-5-6 23:14 回复此发言


4
回复:VC的LNK2005错误,用于避免重复包含的宏为什么无效?

终于有回复了,感激涕零ing……T_T
Sorry……我那个头文件说穿了就是个为了以后公用而写的“函数库”,是独立于当前工程之外的,故而头文件里的这些函数也不是任何一个类的成员函数。
况且,这个头文件在Dev-Cpp里即使包含了多次也没有任何错误的啊。
还有,如果真的要把这些函数的实现挪到cpp里,那岂不还是得把这个cpp文件同样在包含此头文件的位置上照旧#include一遍,跟直接#include这个头文件还有什么不同呢?
OK,不管怎么着,先谢谢3楼的老大了:)

作者: 125.33.10.*

2008-5-7 00:18 回复此发言


5
回复:VC的LNK2005错误,用于避免重复包含的宏为什么无效?


是这样写
common.h 当中声明

#ifudef
....
void foo();
#endif
common.cpp 当中写实现
#include"common.h"
void foo()
{
....
}
然后调用的文件只需要包含头文件就行了
#include"common"
int call()
{
foo();
}
include的意思就是把整个文件的类容copy过来。

作者: 求是的梦

2008-5-7 01:05 回复此发言


6
回复:VC的LNK2005错误,用于避免重复包含的宏为什么无效?

刚刚在Dev-Cpp里试了一下3、5楼的双文件法,结果成功通过了连接,待会去VC里试试看-_-
可是……可是话说回来,难道写有函数定义的头文件就真的“永远”不能在同一个工程中的不同文件里重复#include了吗?都需要另建一个c或cpp文件来做写函数定义体才能连接成功的吗?
——该不会我这么久以来所坚信的“在头文件里设置了重复包含保护宏之后就可以随意#include了”的观点一直就是错的吧?天!无论如何,先谢谢二位提点,我这就去测验一遍看看……

作者: 125.33.10.*

2008-5-7 01:34 回复此发言


7
回复:VC的LNK2005错误,用于避免重复包含的宏为什么无效?

还是不对呀,按照5楼的方式编写2个文件:
//头文件
#ifndef MY_H
#define MY_H
/*
函数声明……
*/
#endif
//实现文件
#include <同名头文件>
/*
函数定义……
*/
连接时LNK2005倒是消失了,可又出现了新的错误:
error LNK2001: unresolved symbol "函数A"(...)
error LNK2001: unresolved symbol "函数B"(...)
……
俨然一副“当前工程中找不到函数定义”的样子,可我如果把实现文件针对添加到工程里的话,跟我的最初“只#include头文件、不增加工程文件数”的期望可就完全背道而驰了啊。
★★★★★★★★★★
简而言之:怎么才能使我的头文件像自带的头文件(如<iostream>、<string>或<stdio.h>)一样可以随处#include呢?
★★★★★★★★★★

作者: 125.33.19.*

2008-5-7 20:06 回复此发言


8
回复:VC的LNK2005错误,用于避免重复包含的宏为什么无效?

大家一般是怎么写这种dú-lì的通用式头文件的呢?
只用同一个头文件来同时包含函数的声明和定义、并在同一工程中多次#include,究竟可不可行?能不能实现呢?

作者: 125.33.1.*

2008-5-8 00:35 回复此发言


9
或者说是暂时解决

呼~非得把所有函数都设置为static之后才能随处#include……-_-

作者: 问题解决啦

2008-5-9 03:14 回复此发言

posted on 2008-11-15 18:35 肥仔 阅读(2677) 评论(0)  编辑 收藏 引用 所属分类: C++ 基础


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理