头文件定义的函数,加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 回复此发言