C++-inline 函数在VC中编译的问题
//inline
bool CPathBasic::IsFileExist(const tstring &oneFile) const
{
#if __UE_WINDOWS__
// we must use GetFileAttributes() instead of the ANSI C functions because
// it can cope with network (UNC) paths unlike them
// Seems below function can't support expression in relative path
DWORD ret = ::GetFileAttributes(oneFile.c_str());
return (ret != static_cast<DWORD>(-1)) && !(ret & FILE_ATTRIBUTE_DIRECTORY);
#endif
return false;
}
//调用的函数
bool CFileBasic::CreateMemoryMapping(const std::wstring &oneFile, void **fileHandle, void **memoryHandle, void **memoryData, UeBase::CFileBasic::UtilityLib ioLib) const //非inline函数,如果是inline的就没问题了。
{
if(m_pathBasic.IsFileExist(oneFile)) //如果IsFileExist是inline的在这里调用会出错
{
switch(ioLib)
{
case UL_Native:
{
#if (__UE_WINDOWS__)
// Firstly to get file handle
#if(__UE_WINCE__)
*fileHandle = ::CreateFileForMapping(oneFile.c_str(), GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL/*|FILE_FLAG_RANDOM_ACCESS*/, NULL);
#else
*fileHandle = ::CreateFile(oneFile.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
#endif
assert(*fileHandle != INVALID_HANDLE_VALUE);
if(*fileHandle == INVALID_HANDLE_VALUE)
{
return false;
}
// Secondly to prepare to map this file
*memoryHandle = ::CreateFileMapping(*fileHandle, 0, PAGE_READONLY, 0, 0, 0);
if(*memoryHandle == NULL)
{
// Exception
long code = ::GetLastError();
//
::CloseHandle(*fileHandle);
*fileHandle = INVALID_HANDLE_VALUE;
return false;
}
// Lastly get the memory address
*memoryData = reinterpret_cast<unsigned char *>(::MapViewOfFile(*memoryHandle, FILE_MAP_READ, 0, 0, 0));
if(*memoryData == NULL)
{
// Exception
long code = ::GetLastError();
}
return (*memoryData) ? true : false;
#endif
}
break;
case UL_Stand:
case UL_STL:
default:
{
#pragma message(__FILE__" >> There still no any implementations about memory mapping against Stand C & STL!")
}
break;
}
}
return 0;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
你能搞个小例子说明问题吗?你的inline函数在什么文件,其他文件怎么组织的。。
一般来说,inline class成员函数是需要写在头文件里面的,在任何使用到inline的地方都要包含其头文件。
inline过的函数实际是不存在的,在编译的时候就连接进去了。
通俗的说
inline int plus(int x,int y)
{
return x+y;
}
int main()
{
int a,b;
cin<<a<<b;
cout<<plus(a,b);
}
会变成形如
int main()
{
int a,b;
cin>>a>>b;
cout<<a+b;
}
的形式。当然具体的代码不一定是这样的,但是plus函数肯定是不存在了。
C++编译的时候是一个个.cpp文件编译的。
所以假如A.cpp里面有一个内联函数func。那么在A.cpp里面用这个函数是不会有问题的,因为编译器会内联它。如果在同一个项目的B.cpp里面用了这个函数,A.cpp的编译成的二进制文件中实际没有func这个函数,所以就会出现LZ看到的找不到函数,因为它确实不存在。
关于inline的更多介绍LZ可以参考:
http://msdn.microsoft.com/en-us/library/z8y1yy88.aspx
如果函数funA的定义前有inline进行修饰,则无论funA是否真的被编译器当做inline函数对待,它都只对当前的cpp文件是可见的。当funA没被当成inline函数时,inline funA与static funA类似。