inline引起的编译错误

 

转载请标明是引用于 http://blog.csdn.net/chenyujing1234 

欢迎大家拍砖

一、定义

inline BOOL CRegistryOperate::DeleteRegeditItem(LPCTSTR szKey, LPCTSTR szSubkey, HKEY hRoot)
{
	HKEY	hKey;
	if (ERROR_SUCCESS == ::RegOpenKeyEx(hRoot, szKey, 0, KEY_ALL_ACCESS, &hKey))
	{  
		if (ERROR_SUCCESS == ::RegDeleteKey(hKey, szSubkey))
		{
			::RegCloseKey(hKey);
			return true;
		}
		::RegCloseKey(hKey);
	}    
	return false;
}


 

二、编译报错

1>   正在创建库 .\Debug/MyGina.lib 和对象 .\Debug/MyGina.exp
1>XRedGina.obj : error LNK2019: 无法解析的外部符号 "public: int __thiscall CRegistryOperate::DeleteRegeditItem(wchar_t const *,wchar_t const *,struct HKEY__ *)" (?DeleteRegeditItem@CRegistryOperate@@QAEHPB_W0PAUHKEY__@@@Z),该符号在函数 "public: int __thiscall CXRedGinaApp::RemoveAutoLogon(void)" (?RemoveAutoLogon@CXRedGinaApp@@QAEHXZ) 中被引用
1>.\Debug/XRedGina.dll : fatal error LNK1120: 1 个无法解析的外部命令


 

 三、解决方法

inline   函数不会生成实体,   因此,如果在编译   单元   A.CPP     中   定义的   该函数,在   B.CPP   编译单   元内是不可见的.   但编译器找到了函数的说明,   (在头文件内),     所以它会认为这是一个普通的函数.   会为调用此函数的地方生成   CALL   指令   来调用.
而在编译A.CPP单元的时候,   编译器可以发现此函数的内联说明.   宏观世界会在调用处进行内联扩展.而不会生成此函数的实体代码.
由于以上原因.   编译两个不同单元的时候对函数的编译方式不一致,导至此函数虽然有调用的地方,却没有实体代码.
解决的方法是,   内联函数应该在头文件内声明,并实现.

1、

把inline去掉,编译通过

BOOL CXRedGinaApp::RemoveAutoLogon()
{
	BOOL bResult = TRUE;
	
	bResult &= m_RegOperate.DeleteRegeditItem(DE_STR_REG_WINLOGON_KEY, DE_STR_REG_WINLOGON_ITEM_AUTOADMINLOGON);
	bResult &= m_RegOperate.DeleteRegeditItem(DE_STR_REG_WINLOGON_KEY, DE_STR_REG_WINLOGON_ITEM_FORCEAUTOLOGON);
	bResult &= m_RegOperate.DeleteRegeditItem(DE_STR_REG_WINLOGON_KEY, DE_STR_REG_WINLOGON_ITEM_DEFDOMNAME);
	bResult &= m_RegOperate.DeleteRegeditItem(DE_STR_REG_WINLOGON_KEY, DE_STR_REG_WINLOGON_ITEM_DEFUSERNAME);
	bResult &= m_RegOperate.DeleteRegeditItem(DE_STR_REG_WINLOGON_KEY, DE_STR_REG_WINLOGON_ITEM_DEFPASSWORD);

	return bResult;
}


你可能感兴趣的:(inline引起的编译错误)