C++-inline 函数在VC中编译的问题

发布于 2016-10-21 18:27:00 字数 2541 浏览 1424 评论 3

//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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

泛泛之交 2017-07-27 22:34:02

你能搞个小例子说明问题吗?你的inline函数在什么文件,其他文件怎么组织的。。

一般来说,inline class成员函数是需要写在头文件里面的,在任何使用到inline的地方都要包含其头文件。

夜无邪 2017-06-15 22:01:38

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

甜柠檬 2017-02-24 02:40:07

如果函数funA的定义前有inline进行修饰,则无论funA是否真的被编译器当做inline函数对待,它都只对当前的cpp文件是可见的。当funA没被当成inline函数时,inline funA与static funA类似。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文