gpt4 book ai didi

c++ - 如何为 VS2008 __forceinline 函数?

转载 作者:行者123 更新时间:2023-11-28 05:39:23 27 4
gpt4 key购买 nike

我需要在 Visual Studio 2008(MFC 项目)中编译的 C++ 项目中“强制内联”以下方法:

//.h file
__forceinline static BOOL IsLicenseGood(LIC_NAME_NUMBER& lnn);

//.cpp file
__forceinline BOOL CMyClass::IsLicenseGood(LIC_NAME_NUMBER& lnn)
{
//Do checks
...
return result;
}

但是当我为 release build 编译它时,它给了我以下重复警告:

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\xmemory(154) : warning C4506: no definition for inline function 'BOOL CMyClass::IsLicenseGood(LIC_NAME_NUMBER &)'
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\vector(46) : warning C4506: no definition for inline function 'BOOL CMyClass::IsLicenseGood(LIC_NAME_NUMBER &)'

知道那里有什么问题吗?

最佳答案

内联有两种工作方式。

“经典”方式是编译器,在从源代码到机器代码的翻译过程中(确切的定义不明确,不同的编译器供应商可能在这方面略有不同)。此方法要求源代码可用于要内联的函数 - 否则,编译器如何内联它?因此,为了使其正常工作,该函数必须只能在一个源文件中使用(因此不需要在任何头文件中声明),或者该函数可以在多个地方使用,只要它被定义在调用代码包含的头文件中。

在你的情况下,编译器提示它不能这样做,因为头文件中只有声明可用,而不是定义 - 所以编译器说“但是你如何期望我做你已经问了,但没有告诉我要内联什么”。

"new"方式称为“链接时间优化”或“全程序优化”(取决于您所谈论的编译器)。这通过仅将源文件部分编译为源代码的某种中间表示形式来工作 - 不是源代码,但也不是实际的机器代码,它是两者之间的某种级别,它有更多关于“代码是关于什么”的信息。当最终的可执行文件被链接在一起时,机器代码就生成了。在此阶段,内联过程也会执行,这意味着即使编译器在编译期间看不到该函数,也可以内 union 适的函数。

这允许从“任何地方”内联,但需要对链接器选项进行不同的设置。我希望 forceinline 仍会收到警告,因为此时编译器不知道您是提前还是延迟内联 - 尽管我对此不是 100% 确定。

您的问题的简单答案是将定义(函数体)移动到头文件,然后完成它。或者删除 forceinline 关键字。

关于c++ - 如何为 VS2008 __forceinline 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37495193/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com