不解于这样一个错误?关于去掉inline后编译通过

Summer_King 2010-10-15 10:54:49
//  DataBaseProcess.h
#pragma once
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF") rename("BOF", "adoBOF")
class CDataBaseProcess
{
public:
CDataBaseProcess(void);
~CDataBaseProcess(void);
protected:
_ConnectionPtr m_pConnection;
BOOL m_bSuccessCreateInstanceForConnect;
BOOL m_bSuccessCreateConnect;
CString m_sConnection;
public:
BOOL InitializeComForADO(void);
void UninitializeFromADO(void);
void SetConnectString(const CString& sConnection);

inline BOOL ConnectToDB(void);// 这里去掉inline后编译就通过了,但是不去会报这样的错误:
//LINK : warning LNK4075: 忽略“/EDITANDCONTINUE”(由于“/INCREMENTAL:NO”规范)
//MainFrm.obj : error LNK2019: 无法解析的外部符号 "public: int __thiscall CDataBaseProcess::ConnectToDB(void)" (?ConnectToDB@CDataBaseProcess@@QAEHXZ) ,该符号在函数 "protected: int __thiscall CMainFrame::OnCreate(struct tagCREATESTRUCTA *)" (?OnCreate@CMainFrame@@IAEHPAUtagCREATESTRUCTA@@@Z) 中被引用
//.\..\\bin/NetworkDataTrans.exe : fatal error LNK1120: 1 个无法解析的外部命令

inline BOOL DisconnectDB(void);// 这里加上inline没问题
};

//MainFrm.h
#include "DataBaseProcess.h"
class CMainFrame : public CFrameWnd
{
//...
public:
CDataBaseProcess m_cDBP;
};

//MainFrm.cpp
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
//...
m_cDBP.DisconnectDB();
m_cDBP.ConnectToDB();// 这里
}

相当不解,是不是我哪里写错了,还是inline用错了,还是其它没注意的地方导致了这里的错(这就玄了)
...全文
145 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
野男孩 2010-10-16
  • 打赏
  • 举报
回复
楼上的,要先感谢国家。。。

不是说除了inline指示外,编译器会根据函数大小自动选择内联短小的函数吗?
傻X 2010-10-15
  • 打赏
  • 举报
回复
原来如此,收益非浅,感谢楼主,感谢各位,最后再谢国家。OYEAH
Eleven 2010-10-15
  • 打赏
  • 举报
回复
inline 函数的申明和定义写在一起,编译器才会认为是内联,否则是普通函数
快乐鹦鹉 2010-10-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 visualwind 的回复:]
这个是因为inline相当于把函数的实现代码嵌入到调用处,但是inline的函数体如果实现在CPP中时,如果函数中引用了别的变量或者别的函数,同时这个变量或函数在调用者处并未include,或者说调用处不知道这个被引用的变量或函数的定义,就会引发LNK2019链接错误。如果去掉inline,调用处只是引用函数的地址,并不需要嵌入函数体,所以不用知道函数体内引用的变量或函数,所以链接就不会错了。
[/Quote]
好有道理。
visualwind 2010-10-15
  • 打赏
  • 举报
回复
这个是因为inline相当于把函数的实现代码嵌入到调用处,但是inline的函数体如果实现在CPP中时,如果函数中引用了别的变量或者别的函数,同时这个变量或函数在调用者处并未include,或者说调用处不知道这个被引用的变量或函数的定义,就会引发LNK2019链接错误。如果去掉inline,调用处只是引用函数的地址,并不需要嵌入函数体,所以不用知道函数体内引用的变量或函数,所以链接就不会错了。
cnzdgs 2010-10-15
  • 打赏
  • 举报
回复
类的成员函数声明为inline类型时,函数体也要inline才行。
class CDataBaseProcess
{
public:
CDataBaseProcess(void);
~CDataBaseProcess(void);
protected:
_ConnectionPtr m_pConnection;
BOOL m_bSuccessCreateInstanceForConnect;
BOOL m_bSuccessCreateConnect;
CString m_sConnection;
public:
BOOL InitializeComForADO(void);
void UninitializeFromADO(void);
void SetConnectString(const CString& sConnection);

inline BOOL ConnectToDB(void)
{
// 把CDataBaseProcess::ConnectToDB中的代码移到这里,不要再定义CDataBaseProcess::ConnectToDB了。
}

inline BOOL DisconnectDB(void)
{
// 把CDataBaseProcess::DisconnectDB中的代码移到这里,不要再定义CDataBaseProcess::DisconnectDB了。
}
};
快乐鹦鹉 2010-10-15
  • 打赏
  • 举报
回复
好奇怪哦。

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧