Inline and dlimport/dllexport
Inline and dlimport/dllexport
现在我分析一些不是我写的旧代码。在标头中有许多这样的声明:
SVPDSDKDLLEXPORT inline C3vec mult(C3vec src, D3DXMATRIX &m);
SVPDSDKDLLEXPORT定义为_declspec(dllexport),如果它用于SVPDSDK;作为_declspec(dllimport),如果它用于任何使用SVPDSDK的项目.dll。 在这里内联对我来说似乎很奇怪,因为标头中没有定义,它.cpp文件中,但是SVPDSDK和所有使用各自DLL的项目的编译和链接, 执行没有任何问题。我假设它只是被忽略了,并且函数被导出,就好像没有内联一样。
我发现了这个讨论:C++ : 带有 dllimport/dllExport 的内联函数?
看起来我应该从所有此类声明中删除"内联",不要混合内联和导出/导入。但后来我在 MSDN 中找到了这个主题:http://msdn.microsoft.com/en-us/library/xa0d9ste
我不明白其中的某些部分。
您可以将具有 dllexport 属性的函数定义为内联函数。在这种情况下,无论程序中的任何模块是否引用该函数,函数始终被实例化和导出。假定该函数由另一个程序导入。
首先,"函数总是实例化",这是什么意思?我在C++中只找到了有关模板函数实例化的主题,没有任何其他实例化。它是否仅与模板连接?
其次,"函数总是导出"。我完全不明白。是否有可能,在某些情况下不导出带有 declspec(_dllexport) 的函数?在什么情况下?
现在关于导入:
还可以将使用 dllimport 属性声明的函数定义为内联函数。在这种情况下,可以扩展函数(受/Ob 规范约束),但永远不会实例化。特别是,如果采用内联导入函数的地址,则返回驻留在 DLL 中的函数的地址。此行为与获取非内联导入函数的地址相同。
同样,我不明白,在这种情况下,实例化意味着什么。
在编写此问题并分析MSDN的主题时,我得出了一个结论,即同时导出/导入和内联的函数仅在其项目本身(在我的例子中为SVPDSDK)中内联,并且在所有导入项目中都是非内联的。MSDN 主题中未明确声明它。如果我不在任何使用它的项目中导入它,并且它的头文件中没有定义,它将是一个普通的内联函数,所以我会收到链接错误。然后对我来说,混合内联和导出/导入是可以接受的,认为这与上面提到的堆栈溢出讨论中的答案相矛盾。我说的对吗?
而且我仍然不明白所有这些关于内联函数实例化的话。
对不起,我把一些问题合并在一个主题中,但我不知道,如何把它分成不同的问题,因为它们是由同一个问题和相同的材料联系在一起的。但是,如果有人能为我澄清这个问题,我将不胜感激。
事实上,inline
是优化器的一种提示。编译器仍然可以生成一个带有 body 的真实函数,在堆栈上推送 args 等。这不会破坏任何逻辑。如果您的"内联"函数有超过 10000 行代码,它肯定会这样做。Microsoft甚至有特殊的__forceinline
关键字。猜猜为什么引入它。
The function is always instantiated and exported ...
这里的措辞可能并不完美。实例化在这里意味着将生成一个主体和一个入口点。这与模板实例化无关。整个段落意味着__declspec
比inline
更重要。
对于dllimport
他们基本上写dllimport
阻止在当前二进制模块中生成此内联函数的主体,而内联扩展仍然是可能的。
- DLL:当 SDK 头文件不使用 __declspec(dllexport) 时,我可以使用它吗
- DLLexport 类模板实例(专用化),减少了仅标头模板库的编译时间
- Clang 是否可以在使用可见性属性时生成导入库(不带 __declspec(dllexport))?
- 为什么MSVC(Visual C++)需要单独的dllimport和dllexport属性,而gcc不需要
- 使用 dllimport 代替 dllexport
- 如何在结构定义中组合__attribute__((dllexport))和[[nodiscard]]?
- VC 链接器错误使用Dllimport/DLLEXPORT宏将标题包括在多个项目中
- 如何使用ctypes将类对象从c ++(DllExport)返回到python,反之亦然
- 使用 dllexport 传递 std::string
- Using __declspec( dllexport )
- 'ShowSUM':__declspec(dllexport)不能应用于具有__clrcall调用约定的函数
- 如何基于每个成员覆盖类范围的__declspec(dllexport)注释?
- 使用__declspec(dllexport)从DLL导出函数
- C++ [[gnu::visibility( "default" )]] vs __declspec(dllexport) on Windows 和 Linux
- 尽管使用了正确的dllExport-Visual Studio,但没有函数导出到DLL中
- 是否可以在程序集中编写dllexport(然后是dllimport)函数
- Inline and dlimport/dllexport
- C#:Cdecl-DllExport,参数中有一个指向类实例的指针
- 当在导入函数之前添加__declspec(dllexport)时,它会做什么
- 使用.def或__declspec(dllexport)导出跨平台代码的共享库符号